Ankündigung

Einklappen
Keine Ankündigung bisher.

Script beendet nicht sauber

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Script beendet nicht sauber

    Hi,
    ich bastele an einem Script, dass per cURL wiederholt eine Schnitstelle anspricht, die zurückgegebene xml parsed und am Ende die relevanten erhaltenen Daten in eine Datei schreibt.

    Ich entwickele und teste lokal auf einer Windows 7 Maschine mit xampp, hier läuft das Script einwandfrei durch und vermeldet Erfolg. Schiebe ich es nun allerdings auf den Server auf dem es letztendlich laufen soll (Debian) läd sich der Browser tot. Ich schreibe auch ein Logfile, welches mir bestätigt, dass das Script weiterhin bis zum Ende durchläuft, allerdings bekommt der Browser nichts davon mit, er behauptet steif und fest weiterhin zu laden. Selbst mit die() ist dies dem Browser ab einem gewissen Punkt nicht mehr abzugewöhnen.

    Hier mein Script (reduziert auf das relevante):
    PHP-Code:
    ini_set('max_execution_time'18000);        //die angesprochene Schnitstelle ist sehr langsam

    $log_file fopen('./logfile''w');
    fwrite($log_filedate('H:i:s')." - Logfile start\r\n ");
    fflush($log_file);

    connect_cURL();

    do {
        
    fwrite($log_filedate('H:i:s')." - send off next query\r\n");
        
    fflush($log_file);
        
    $has_more fetchNextDataSet();
            
    //die("so we can halt here....");      //wenn ich hier ein die mache hält der Browser noch an

           //Daten verarbeiten, zur Zeit komplett auskommentiert, der Fehler tritt weiterhinauf
    } while ($has_more);
    //die("but we can't halt here");           //ein die() hier beendet zwar das Script, aber der Browser bekommt es nicht mehr mit

    disconnect_cURL();

    fwrite($log_filedate('H:i:s')." - finished loop, write to file\r\n");
    fflush($log_file);

    //daten in datei schreiben

    fwrite($log_filedate('H:i:s')." - done\r\n");
    fflush($log_file);
    fclose($log_file); 
    Das Script loggt mir auch brav raus wie es alle nötigen querys absetzt, schreibt die Daten und schreibt auch done ins Logfile, aber der Browser läd weiter. Wenn ich versuche mit die() zu beenden funktioniert das anfangs auch, wie oben in den Kommentaren angegeben, allerdings zu späteren Zeitpunkten im Script beendet das die() zwar das script (entsprechende Log-Einträge werden nicht mehr geschrieben) aber nicht das Laden des Browsers.

    Hat jemand eine Idee was hier dazu führen könnte, dass der Browser nicht informiert wird? Ich habs mit Firefox und Chrome getestet, in beiden das gleiche verhalten. Da es lokal im xampp läuft, gibt es bekannte Unterschiede im verhalten zu einem Apache unter Debian? Der einzige mir bisher bekannte Unterschied ist dass der xampp bei Dateipfaden caseinsensitiv ist, aber ich öffne neue Dateien um Daten und Logfile zu schreiben, hier kann das Problem also nicht liegen.

  • #2
    Stelle sicher, ob max execution time, .. geändert werden darf und ausgeführt wird. Hast du die nötige Berechtigung?

    Kommentar


    • #3
      Ja, die max execution time wird geändert, eine Anfrage an die Schnittstelle dauert je nachdem wie sie gerade drauf ist zwischen 90 und 300 Sekunden, daher war das essentiell.
      Ich habe in der zwischenzeit etwas weiter experiementiert. Bei derzeitiger Datenmenge (die könnte sich später noch vergrößern) sende ich 10 Anfragen an die Schnittstelle. Solange ich spätestens nach der achten ein die() mache klappt das alles sauber, mache ich das die() nachdem ich die neunte oder zehnte Anfrage gesendet habe beendet sich nurnoch das Script, der Browser bekommt es aber nicht mehr mit.
      Ein workaround wäre also ggf (habs noch nicht getestet) das Script nach einer weile abzubrechen, sich zu merken wo man war und dann erneut zu starten und dort weiter zu machen. Deutlich lieber wäre es mir allerdings das Script würde in eins durchlaufen. Außerdem ist mir nicht klar wieso er nach mehr als 8 Abfragen dieses Verhalten zeigt, wäre daher auch wohl nicht grad garantiert dass es so dann langfristig immer läuft... ideal wäre also zu verstehen warum da die Kommunikation zwischen Server und Client nicht mehr zu funktionieren scheint.

      Kommentar


      • #4
        Ich frage mich gerade, warum du das überhaupt über den Webserver laufen lässt?
        Für mich klingt das nach einer klassischen CronJob-/Shell-Aufgabe.
        Wenn's denn unbedingt im Browser sein muss, weil du ein Ergebnis sehen willst, lass es über AJAX laufen.
        Schreib eine Queue in die du alle einzelnen Requests reinpackst und der Client soll dann eben soviele parallele Anfragen (oder auch nacheinander) starten.
        VokeIT GmbH & Co. KG - VokeIT-oss @ github

        Kommentar


        • #5
          Wie hoch ist denn KeepAliveTimeout eingestellt?

          Dafür würde sich, wie G.Schuster schon meinte, Long polling oder ein Socket anbieten: http://www.php-tagebuch.de/long-poll...-php-tutorial/
          I like cooking my family and my pets.
          Use commas. Don't be a psycho.
          [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

          Kommentar

          Lädt...
          X