Der Martin: PHP während der Ausführung stoppen

Beitrag lesen

Hallo,

wie ich andern Orts schon mal beschrieben habe, arbeite ich aktuell an Skripten die eine längere Ausführung haben können.

kein Kommentar. Aber du weißt, was ich dazu eigentlich sagen möchte. 😉

Es ist mir jetzt schon öfters passiert, dass ich eine Berechnung über den Browser angestoßen habe die länger braucht. Das Skript rattert los und zeigt nach einer Minute das Ergebnis. Eigentlich kein Problem, wenn ich nach wenigen Sekunden nicht eine Korrektur vornehmen wollen würde.

Sowas wie "Halt, ich wollte nicht die ganze Datenbank durchsuchen, sondern nur die jüngsten 100 Datensätze"?

Wie breche ich das Skript wieder ab? Einfach Browser schließen ist nicht die Lösung - der lokale Webserver arbeitet trotzdem weiter.

Der Webserver läuft sowieso weiter. Du meintest vermutlich den PHP-Prozess, den der Webserver als Kind startet. Ja, der läuft zunächst mal weiter. Aber dadurch, dass der Client die Verbindung beendet hat, fehlt dem PHP-Prozess plötzlich der Ausgabekanal (stdout). Sobald er das nächste Mal versucht, etwas auf das nicht mehr gültige stdout-Handle zu schreiben, wird er vom Betriebssystem beendet.[1]

Solange er aber keine Ausgabe macht, läuft der eigentlich tote Prozess im Gruselkabinett des Betriebssystems weiter.

Öffne ich die Seite neu muss ich trotzdem warten.

Ja. Aber nicht auf den vom vorigen Request noch laufenden Prozess. Normalerweise forkt der Webserver für jeden Request einen neuen Kindprozess. Wenn du also warten musst, bis der scheintote Prozess endlich fertig ist, hast du selbst einen Flaschenhald gebaut. Zum Beispiel exklusiven Zugriff auf eine bestimmte Systemressource.

Allerdings darf sich das PHP-Script auch gern etwas kooperativ verhalten und in der lange laufenden Schleife zyklisch nachfragen, ob die Verbindung noch steht, und falls nicht, das Script kontrolliert beenden.

Immer eine Handbreit Wasser unterm Kiel
 Martin

--
Wenn ich den See seh, brauch ich kein Meer mehr.

  1. Es sei denn, er hat sich vorher unsterblich gemacht. ↩︎