"We are back" « oc.at

php: ignore_user_abort funzt nicht

kleinerChemiker 21.12.2004 - 11:37 1472 8
Posts

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4307
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4307
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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4307
nun versteh ich gar nix mehr. ich habe folgendes skript gestartet und abgebrochen.

Code: PHP
<?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
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4307
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
Avatar
Registered: Dec 2004
Location: Wien
Posts: 85
Hi,

versuchs mal mit register_shutdown_function

mfg
Xetrill
Bearbeitet von Xetrill am 05.01.2005, 21:22

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
was ja zum glück überhaupt nichts mit dem problem zu tun hat. :rolleyes:

Xetrill

Little Overclocker
Avatar
Registered: Dec 2004
Location: Wien
Posts: 85
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
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz