Laufzeitfehler beheben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Laufzeitfehler beheben

    Hallo zusammen,

    ich habe ein Script geschrieben, welches .xml Dateien aus einem Ordner ausliest, verarbeitet und dann mit der MySQL Datenbank abgleicht und ggf. die neuen Daten übergibt/überschreibt.

    Dies klappt auch bei 100-500 Dateien einwandfrei.

    Nun habe ich Auftragsdaten, wo jeder Auftrag eine Datei darstellt und das sind bereits über 9000.

    Führe ich das gleiche Script mit dieser Anzahl aus, braucht es sehr lange und bricht dann nach ca. 25 Sekunden mit folgender Meldung ab:
    Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request.
    Please contact the server administrator to inform of the time the error occurred and of anything you might have done that may have caused the error.
    More information about this error may be available in the server error log.


    Da alle xml Dateien immer überprüft werden müssen (Weil sie aus dem WaWi auch immer komplett übertragen werden und ich somit nicht nur die xml-Dateien mit dem neusten Zeitstempel importieren kann), muss ich irgendwie die Laufzeit verlängern.

    So Sachen wie ini_set('max_execution_time', 120); habe ich bereits versucht, bringen mir aber leider nichts (Bricht auch wieder nach 25sek ab).

    Kann mir wer helfen? :)

    LG und herzlichen Dank!
    Tobbe
  • Mooin,

    so 'ne Fehlermeldung ist sehr allgemein und kann tausend Ursachen haben. ;) Das häufigste, was ich bisher gesehen habe war, dass etwas in der .htaccess nicht gestimmt hat, was hier aber anscheinend nicht der Fall ist.

    Hast du Zugriff auf irgendwelche Logs? Meine erste Vermutung wäre, dass dein RAM vollläuft, aber das würde eigentlich keinen 500er-Fehler ausgeben.


    Gruß
    Arno
  • Nun wurde die Schnittstelle angepasst, sodass ich nicht täglich alle Dateien abgleichen/uploaden muss, sondern nur die geänderten.

    Trage nun nach jedem erfolgreichen Durchlauf einen Eintrag in die Datenbank ein, sodass ich abgleichen kann, welche neuen Daten seitdem letzten Cronjob neu im ordner liegen. So einfach so gut, wieso gibt mir folgendes Script keinmal "Test" aus?

    Quellcode

    1. // Ordnerpfad öffnen
    2. $ordnerpfad="../Kunden/";
    3. $handle=opendir($ordnerpfad);
    4. // Datum des letzten Cronjobs auslesen
    5. $abfrage = "SELECT * FROM warenwirtschaft__cronjobaufrufe WHERE cronjob_name='$cronjobname' AND erfolgreich='1' ORDER BY datum_zeit DESC LIMIT 1";
    6. $erg = mysql_query($abfrage);
    7. while($row = mysql_fetch_object($erg))
    8. {
    9. echo 'Cronjob: '.$row->datum_zeit.'<br/><br/>';
    10. $letztercron_zeit=$row->datum_zeit;
    11. }
    12. $i=0;
    13. // Alle Dateien nacheinander einlesen
    14. while ($datei = readdir ($handle))
    15. {
    16. $dateizeit=filemtime($ordnerpfad.$datei);
    17. clearstatcache();
    18. $dateizeit=date('Y-m-d H:i:s', $dateizeit);
    19. echo 'Datei: '. $dateizeit.'<br/>';
    20. // Wenn die Dateien ".xml" beinhalten und das Änderungsdatum nach dem letzten Cron liegt
    21. if((stristr($datei, '.xml'))&&($dateizeit>=$letztercron_zeit))
    22. {
    23. "Test";
    24. }
    25. }
    26. // Ordnerpfad schließen
    27. closedir($handle);
    Alles anzeigen


    Die Ausgabe sieht wie folgt aus:

    Cronjob: 2015-01-20 00:08:54

    Datei: 2015-02-09 09:22:27
    Datei: 2015-01-27 12:19:10
    Datei: 2015-01-20 00:09:16
    Datei: 2015-01-20 00:16:00
    Datei: 2015-01-20 00:12:34
    Datei: 2015-01-20 00:18:25
    Datei: 2015-01-20 00:08:07
    Datei: 2015-01-20 00:15:54
    Datei: 2015-01-20 00:13:29
    Datei: 2015-01-20 00:18:53
    Datei: 2015-01-20 00:11:36
    Datei: 2015-01-20 00:09:33


    Laut meinem verständnis müsste nun hinter allen Daten, die nach dem "2015-01-20 00:08:54" sind, ein "Test" erscheinen.

    Kann mir da jemand helfen?

    Danke!
  • Ich vermute es liegt am Zeitvergleich. Du kannst keine formatierten Zeiten miteinander vergleichen. Erzeuge für den letzen Cronjob mit mktime einen Timestamp und vergleiche die beiden miteinander (d.h. Zeile 23 kannst du streichen).

    Tipp: Falls du, wie hier zwei mögliche Fehlerquellen hast, dann teile die Anweisung in 2 if-Anweisungen um den Fehler besser lokalisieren zu können. Theoretisch könnte der Fehler auch beim Erkennen der XML-Datei liegen.
  • Hallo freeek,

    danke für deine Antwort! :) Habe mir so etwas ähnliches schon gedacht, deshalb habe ich auch lieber mit "Y-m-d H:i:s" gearbeitet, da ich Timestamps nicht so schnell vergleichen kann (Also ob das eine Datum vor dem anderen liegt) :)

    Der Code wurde nun angepasst:

    Quellcode

    1. // Ordnerpfad öffnen
    2. $ordnerpfad="../Kunden/";
    3. $handle=opendir($ordnerpfad);
    4. // Datum des letzten Cronjobs auslesen
    5. $abfrage = "SELECT * FROM warenwirtschaft__cronjobaufrufe WHERE cronjob_name='$cronjobname' AND erfolgreich='1' ORDER BY datum_zeit DESC LIMIT 1";
    6. $erg = mysql_query($abfrage);
    7. while($row = mysql_fetch_object($erg))
    8. {
    9. $letztercron_zeit=mktime($row->datum_zeit);
    10. echo 'Cronjob: '.$letztercron_zeit.'<br/><br/>';
    11. }
    12. $i=0;
    13. // Alle Dateien nacheinander einlesen
    14. while ($datei = readdir ($handle))
    15. {
    16. $dateizeit=filemtime($ordnerpfad.$datei);
    17. clearstatcache();
    18. echo 'Datei: '. $dateizeit;
    19. // Wenn die Dateien ".xml" beinhalten und das Änderungsdatum nach dem letzten Cron liegt
    20. if(stristr($datei, '.xml'))
    21. {
    22. echo " - Datei ist .xml ( ".$datei." )";
    23. if($dateizeit>=$letztercron_zeit)
    24. {
    25. "Test";
    26. }
    27. }
    28. echo '<br/>';
    29. }
    30. // Ordnerpfad schließen
    31. closedir($handle);
    Alles anzeigen


    Die Ausgabe sieht nun so aus:
    Cronjob: 1430776657

    Datei: 1423554557
    Datei: 1422357550
    Datei: 1421708956 - Datei ist .xml ( 00001343.xml )
    Datei: 1421709360 - Datei ist .xml ( 00005651.xml )
    Datei: 1421709154 - Datei ist .xml ( 00003489.xml )
    Datei: 1421709505 - Datei ist .xml ( 00007264.xml )
    Datei: 1421708887 - Datei ist .xml ( 00000623.xml )
    Datei: 1421709354 - Datei ist .xml ( 00005591.xml )
    Datei: 1421709209 - Datei ist .xml ( 00004091.xml )
    Datei: 1421709533 - Datei ist .xml ( 00007572.xml )
    Datei: 1421709096 - Datei ist .xml ( 00002879.xml )
    Datei: 1421708973 - Datei ist .xml ( 00001525.xml )
    Datei: 1421709433 - Datei ist .xml ( 00006436.xml )
    Datei: 1421709366 - Datei ist .xml ( 00005696.xml )


    Leider immer noch kein Test... - Die Dateien sind die selben wie oben.

    Woran könnte es noch liegen?

    Danke!