php: ignore_user_abort funzt nicht
kleinerChemiker 21.12.2004 - 11:37 1472 8
kleinerChemiker
Here to stay
|
der anfang meines skripts sieht so aus:
<?php ignore_user_abort(TRUE); ini_set('ignore_user_abort', TRUE);
nun sollte man hoffen, daß das skript auch weiterläuft, wenn der browser gestoppt wird. tut es aber leider nicht. das skript soll einige datenbankmanipulationen machen, jedoch hab ich das problem, daß es nicht durchläuft. es wird von nem externen server angestoßen, schienbar setzt der aber die verbindung zu früh zurück. kennt jemand eine möglichkeit außer das skript auf mehrere aufzuteilen?
tia
MIK
|
watchout
Legendundead
|
eines sollte normal ausreichen, probiere es vielleicht mit einem einfachen script aus, obs wirklich an der config liegt, oder woanders (z.B. wait(20); file_put_contents("bla.txt","fubar"); ) vielleicht liegts bei dir auch an der script-execution-time, die zu kurz is? http://cz.php.net/manual/en/function.set-time-limit.php
|
kleinerChemiker
Here to stay
|
ich hab beides, weil eben das problem bestand, daß das skript nicht zuende ausgeführt wird. max-execution-time sund 30 sekunden, das skript braucht sicher keine 5 sekunden. wenn ich das skript im browser zu ende laufen lasse ists kein problem, nur wenn ich es eben abbreche. ein phpinfo() nach den ersten zeilen bestätigt, daß ignore_user_exit true ist. aber dennoch werden die datenbankabfragen nicht zu ende ausgeführt  aber ich werd das mal mit dem testskript versuchen.
|
kleinerChemiker
Here to stay
|
nun versteh ich gar nix mehr. ich habe folgendes skript gestartet und abgebrochen. <?php
sleep(20);
$f = fopen('test.txt', "a");
fputs($f, "test\n");
?>
seltsamerweise wurde es bis zum ende ausgeführt, obwohl ich es abgebrochen habe und user_abort vorher nicht aktiviert wurde.
|
Ringding
Pilot
|
Dieser Abbruch ist bestenfalls nichtdeterministisch. Meine Vermutung ist, dass das Ding gar nicht mitbekommt, dass die Verbindung weg ist, solange es nicht versucht, etwas auszugeben. Und dann darf das output buffering auch nicht eingeschaltet sein.
Mach mal nach dem sleep() ein echo() oder trenn das in zwei <? ?> Blöcke.
|
kleinerChemiker
Here to stay
|
ich hatte auch nach dem sleep ein echo, wurde dennoch bis zum ende ausgeführt, obwohl user_abort nicht gesetzt war.
das "echte" skript das nicht immer zum ende ausgeführt wird, obwohl user_abort auf true ist, hat übrigens auch keine ausgabe. ziel ist es nur in einer datenbank ein paar tabels die als art cache dienen zu füllen.
|
Xetrill
Little Overclocker
|
Bearbeitet von Xetrill am 05.01.2005, 21:22
|
watchout
Legendundead
|
was ja zum glück überhaupt nichts mit dem problem zu tun hat.
|
Xetrill
Little Overclocker
|
Stimmt, es hat nichts mit dem Problem zu tun sondern mit der Lösung.
Wenn er einfach seinen ganzen Code in eine mit register_shutdown_function registrierten Funktion platziert kann er das ignore_user_abort() weglassen. Und braucht auch keine pseudo-Verbindung.
Das Skript wird normal per GET aufgerufen und läuft durch bis zur Shutdownphase, wo alle registrierten Funktionen abgearbeitet werden.
Unkompliziert, relativ Sauber und vorallem einfach.
MfG Xetrill
|