[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Cronjob legt Seite lahm - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Cronjob legt Seite lahm

5. Feb 2014, 17:24

Um eine CSV in eine XForm-Datenbank zu importieren habe ich den vorhandenen XForm-Code modifiziert und in einen Cronjob vom Type PHP gepackt. Die Ausführung funktioniert auch perfekt, wenn ich den CJ manuell starte. Die Laufzeit beträgt nur wenige Sekunden.

Wird der CJ aber durch den Besuch des Frontends angeschubst, dann steht die Seite. Erst das Schließen des Browser lässt die Seite wieder auftauchen. Der CJ wurde aber ordnungsgemäß ausgeführt.

Woran kann das liegen?

Hier noch der Quelltext:

Code: Alles auswählen

<?php

ini_set("auto_detect_line_endings", true);

$show_importform = FALSE;
$show_list = FALSE;

$table['table_name'] ="rex_com_user";

$rfields = rex_xform_manager_table::getFields($table['table_name']);

//$replacefield = rex_request("replacefield","string");
//echo $replacefield;echo '<br />';
$replacefield = "Mitgliedsnummer";

$divider = rex_request("divider","string",";");
//echo $divider; echo '<br />';
$divider = ";";

//$missing_columns = rex_request("missing_columns","int");
//echo 'Missin:'.$missing_columns;echo '<br />';
$missing_columns = "1";

$debug = rex_request("debug","string");
//echo 'Debug: '.$debug;

if($replacefield == "") $replacefield = "id";
if(!in_array($divider,array(";",",","tab"))) $divider = ",";
if($missing_columns != 2 && $missing_columns != 3) $missing_columns = 1;
if($debug != 1) $debug = 0;



    $func = "";
    $show_importform = FALSE;

    $fieldarray = array();
    //$filename = $_FILES['file_new']['tmp_name'];

    $div = $divider;
    if($div == "tab") $div = "\t";

    $counter = 0;  // importierte
    $dcounter = 0; // nicht imporierte
    $ecounter = 0; // leere reihen
    $rcounter = 0; // replace counter
    $icounter = 0; // insert counter
    $errorcounter = 0;

    $i = rex_sql::factory();
    if($debug) {
      $i->debugsql = 1;
    }
    $fp = fopen("../redaxo/include/addons/xform/plugins/manager/import/blarablara.csv",'r');
    while ( ($line_array = fgetcsv ($fp, 30384, $div)) !== FALSE )
    {

      if(count($fieldarray) == 0)
      {
        // ******************* first line

        $fieldarray = $line_array;

        $mc = array();
        foreach($fieldarray as $k => $v)
        {
          if(!array_key_exists($fieldarray[$k],$rfields))
          {
            $mc[$fieldarray[$k]] = $fieldarray[$k];
          }
        }

        if(count($mc)>0)
        {
          if($missing_columns == 3)
          {
            echo rex_warning('Es fehlen folgende Felder: '.implode(", ",$mc));
            $show_importform = TRUE;
            $func = "import";
            break;

          }elseif($missing_columns == 2)
          {
            $error = FALSE;
            foreach($mc as $mcc)
            {
              $sql = 'ALTER TABLE `'.$table['table_name'].'` ADD `'.mysql_real_escape_string($mcc).'` TEXT NOT NULL;';
              $upd = rex_sql::factory();
              $upd->setQuery($sql);

              if($upd->getError())
              {
                $error = TRUE;
                echo rex_warning('Feld "'.$mcc.'" konnte nicht angelegt werden: '.$upd->getError());

              }else
              {
                echo rex_info('Feld "'.$mcc.'" wurde angelegt');
              }

            }
            if($error)
            {
              echo rex_warning('Import wurde abgebrochen, da Fehler aufgetaucht sind.');
              $show_importform = TRUE;
              break;
            }

            $rfields = rex_xform_manager_table::getFields($table['table_name']);

          }

        }



      }else
      {
        if(!$line_array)
        {
          break;

        }else
        {

          $counter++;
          $i->setTable($table['table_name']);
          $replacevalue = "";
          foreach($line_array as $k => $v)
               {
                  if($fieldarray[$k] != "" && array_key_exists($fieldarray[$k],$rfields))
                  {
                     //$i->setValue($fieldarray[$k],mysql_real_escape_string($v));
                     $i->setValue($fieldarray[$k],mysql_real_escape_string(utf8_encode($v)));
                     if($replacefield == $fieldarray[$k])
                     {
                        //$replacevalue = $v;
                        $replacevalue = utf8_encode($v);
                     }
                  }
               }

          // noch abfrage ob
          // $replacefield
          $cf = rex_sql::factory();
          $cf->setQuery('select * from '.$table['table_name'].' where '.$replacefield.'="'.mysql_real_escape_string($replacevalue).'"');

          if($cf->getRows()>0)
          {
            $i->setWhere($replacefield.'="'.mysql_real_escape_string($replacevalue).'"');
            $i->update();
            $error = $i->getError();
            if($error == "") {
              $rcounter++;
            }else {
              $dcounter++;
              echo rex_warning('Datensatz konnte nicht importiert werden: '.$error);
            }
          }else
          {
            $i->insert();
            $error = $i->getError();
            if($error == "") {
              $icounter++;
            }else {
              $dcounter++;
              echo rex_warning('Datensatz konnte nicht importiert werden: '.$error);
            }
          }

        }
      }
      //$show_list = TRUE;
    }
?>
Danke für Eure Hilfe!

Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Re: Cronjob legt Seite lahm

19. Feb 2014, 10:40

Hat den keiner eine Idee?

Über einen Hinweis wäre ich wirklich dankbar!

helga
Beiträge: 137
Registriert: 17. Apr 2007, 14:48
Kontaktdaten: Website

Re: Cronjob legt Seite lahm

20. Feb 2014, 14:29

schau mal in deine error.log, da könnte eventl. was drinne stehen, dass dein fopen-Pfad nicht gefunden werden kann.

Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Re: Cronjob legt Seite lahm

20. Feb 2014, 16:48

Hallo Helga,

danke für Deinen Tipp. Im error.log nix zu finden.

Aber daran wird es nicht liegen, denn ich kann den Cronjob manuell im Backend fehlerfrei ausführen. Nur wenn er durch Redaxo selbst gestartet wird, steht die ganze Seite für ca. 30 sec.

Benutzeravatar
webghost
Beiträge: 266
Registriert: 6. Okt 2010, 20:10
Kontaktdaten: Website

Re: Cronjob legt Seite lahm

23. Feb 2014, 22:19

je nach Datenmenge dauert das halt eine Weile. Nach den 30 sec geht es nicht weiter?
Da aber der chron ausgeführt wird funktioniert es ja eigentlich. Kann es sein das sich aus irgend einem Grund der Browser aufhängt? Hast Du mal einen anderen probiert?

Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Re: Cronjob legt Seite lahm

24. Feb 2014, 10:58

Noch einmal der Sachverhalt:

Starte ich den Cron im Backend, dauert die Einbindung der Datei nicht einmal 3 Sec. Sowohl Backend als auch Frontend sind erreichbar.

Wird der Cron durch den Aufruf des Frontends gestartet, ist die Seite nicht aufrufbar. Auch das in weiterem Tab geöffnete Backend steht. Das bleibt auch so. Rufe ich während des Stillstands mit einem beliebigen anderen Browser das Frontend oder das Backend auf, so funktioniert das.

Um im ursprünglichen Browser die Seite wieder zum Laufen zu bringen reicht es nicht, die Tabs zu schließen. Erst nach einem kompletten Neustart des ursprünglichen Browsers ist sowohl Back- als auch Frontend wieder erreichbar.

error.log sind keine relevanten Einträge vorhanden.

Die Import-Datei hat 777.

Benutzeravatar
webghost
Beiträge: 266
Registriert: 6. Okt 2010, 20:10
Kontaktdaten: Website

Re: Cronjob legt Seite lahm

24. Feb 2014, 11:54

Dein Browser bleibt hängen, ob das was mit dem Cron zu tun hat bezweifle ich. Hast Du das schon mal in einem anderen Browser versucht, also direkt nicht erst nach dem hängen bleiben?

Welchen Browser nutzt Du?

Falls Du js code im Frontend hast lass den doch mal testweise weg.

Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Re: Cronjob legt Seite lahm

24. Feb 2014, 14:04

Habe es gerade mit anderen Browsern porbiert: gleiches Ergebnis.

Derjenige, der durch den Seitenaufruf den Cron anschubst, bleibt hängen, solange bis er den Browser schließt und neu startet. Andere Browser, die während dem hängenden Browser offen sind oder geöffnet werden, haben keine Probleme.

Kann das irgendwie mit einer Session-Id zu tun haben die das Community-Addon automatisch einbaut?

Benutzeravatar
webghost
Beiträge: 266
Registriert: 6. Okt 2010, 20:10
Kontaktdaten: Website

Re: Cronjob legt Seite lahm

24. Feb 2014, 14:42

es gab in php4 mal ein Problem mit sessionsvariablen die den Browser lahm legten https://bugs.php.net/bug.php?id=2196 das ist aber echt Schnee von gestern

kannst ja mal versuchen mit session_destroy im Script vor der Ausführung die Session zu löschen. Sonst weiss ich da auch nicht weiter. Ein JS-Problem kannst Du ausschliessen?

Ich würde mal stückweise Code entfernen um das Problem so eingrenzen zu können.

Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Re: Cronjob legt Seite lahm

24. Feb 2014, 16:41

Ich probiere das mal mit stückweisem auskommentieren. Denn ich habe es auch schon mit einem echo 'hallo Welt' probiert. Da funktioniert es.

Ich lasse was von mir hören.

Danke Dir auf alle Fälle.

Benutzeravatar
webghost
Beiträge: 266
Registriert: 6. Okt 2010, 20:10
Kontaktdaten: Website

Re: Cronjob legt Seite lahm

24. Feb 2014, 21:38

würde mich dann schon interessieren was es war :wink:

Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Re: Cronjob legt Seite lahm

5. Mär 2014, 18:14

Hallo meine Lieben,

jetzt habe ich ordentlich ausgetestet. Es liegt definitiv am Fopen(). Der Cron kann die Datei nicht öffnen, wenn der Job durch die Anwahl der Seite ausgelöst wird, trotz 777, auch wenn die Datei im /files liegt.

durch

Code: Alles auswählen

if(($fp = fopen("../files/isvimport.csv",'r')) !== FALSE)
...
else echo 'Oeffen der Datei fehlgeschlagen';
erhalte ich im Cron-Log die Meldung. Ansonsten legt es die Seite lahm. Egal welcher Browser.

Es funktioniert nur die Ausführung durch manuellen Start im Backend.

Bin dankbar für jede weitere Idee.

Benutzeravatar
webghost
Beiträge: 266
Registriert: 6. Okt 2010, 20:10
Kontaktdaten: Website

Re: Cronjob legt Seite lahm

5. Mär 2014, 18:43

Dann stellt sich die Frage welche PHP-Version läuft.

schau mal hier http://www.php.net/manual/de/function.fopen.php unter Anmerkungen

Wobei das doch eigentlich eine Fehlermeldung geben müsste.

Benutzeravatar
ritzfritz
Beiträge: 61
Registriert: 18. Mär 2008, 17:36
Wohnort: Rotttal-Inn

Re: Cronjob legt Seite lahm

6. Mär 2014, 12:59

Servus Webghost,

REDAXO: 4.4.1
PHP: 5.4.4-14+deb7u8 steht da.

Wie gesagt, das Frontend schafft es nicht, die Datei zu öffnen, das Backend schon, wenn ich den Cronjob "manuell" ausführe.

Benutzeravatar
webghost
Beiträge: 266
Registriert: 6. Okt 2010, 20:10
Kontaktdaten: Website

Re: Cronjob legt Seite lahm

6. Mär 2014, 16:06

genau darum dachte ich noch an ein Problem mit SafeMode - kann in php 5.4 aber nicht sein. Das andere ist noch dass es unterschiedliches Verhalten geben kann je nachdem ob php als Modul läuft oder cgi.

ich würde mal versuchen den cron-Typ zu ändern um zu sehen ob es vielleicht mit einem URL-Aufruf funktioniert...

grad noch was gesehen: gib mal den Pfad zur csv absolut an. weiss nicht wovon im cron jetzt ausgegangen wird, aber ein Aufruf aus dem Stammverzeichnis mit ../ würde fehlschlagen

Zurück zu „Allgemeines [R4]“