PHP-Hintergrundprozesse
Ich versuche, mich ein PHP-script, ich habe das script fertig, aber es dauert etwa 10 Minuten, um den Prozess zu beenden, ist es entworfen, um zu tun. Dies ist nicht ein problem, allerdings vermute ich, dass ich weiter die Seite geladen ist all diese Zeit, die ist nervig. Kann ich es so haben, dass ich den Prozess starten und dann wieder 10min später und nur Blick in die log-Datei erzeugt hat?
InformationsquelleAutor der Frage zuk1 | 2008-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, können Sie verwenden "ignore_user_abort(true)"
So wird das script weiter zu arbeiten (halten Sie ein Auge auf Skript-Dauer, vielleicht fügen Sie ein "set_time_limit(0)")
Aber eine Warnung: Sie werden nicht in der Lage sein zu stoppen ein Skript mit diesen beiden Zeilen:
Außer Sie können direkt auf den server zugreifen und den Prozess zu beenden! (Been there, done eine Endlosschleife, das sich immer und immer wieder, machte den server kommen zu einem kreischenden halt, bekam schrie Sie an...)
InformationsquelleAutor der Antwort bastiandoeen
Klingt wie Sie haben sollten, eine Warteschlange und ein externes Skript für die Verarbeitung der Warteschlange.
Zum Beispiel dein PHP-script sollte einen Eintrag in eine Datenbank-Tabelle und Rückgaberecht Weg. Dann ein cron läuft jede minute überprüft die Warteschlange und Gabeln ein Prozess für jeden job.
Der Vorteil hier ist, dass Sie nicht sperren Sie einen apache-thread für 10 Minuten.
InformationsquelleAutor der Antwort Gary Richardson
Ich hatte viele Probleme mit dieser Art von Prozess unter windows; Meine situation war ein wenig anders, ich habe keine sorgen über die Reaktion der "script"- ich wollte das Skript zu starten und damit andere Seite anfordert, um durch zu gehen, während er damit beschäftigt war, die Arbeit Weg.
Aus irgendeinem Grund, ich hatte Probleme mit hängenden andere Anfragen, oder ein Timeout nach 60 Sekunden (apache und php eingerichtet wurden, werden nach etwa 20 Minuten); Es stellt sich auch heraus, dass firefox mal nach 5 Minuten (standardmäßig) sowieso so, nach diesem Punkt können Sie nicht wissen, was Los ist über den browser ohne änderung der Einstellungen in firefox.
Landete ich mit dem Prozess öffnen und schließen Methoden zum öffnen einer php im cli-Modus etwa so:
pclose(popen("start php myscript.php", "r"));
Dies würde ( mit start ) öffnen Sie die php-Prozess und dann kill den Prozess starten zu verlassen php läuft, wie lange es gebraucht wird - wieder würden Sie brauchen, um zu töten, den Prozess manuell heruntergefahren werden. Es machte nicht brauchen Sie irgendwelche time-outs und man konnte lassen Sie die aktuelle Seite, dass heißt es weiter-und output-einige weitere details.
Das einzige Problem mit diesem ist, dass, wenn Sie benötigen, senden Sie das Skript alle Daten, solltest du entweder über eine andere Quelle oder es passieren entlang der "Eingabeaufforderung" als Parameter; das ist nicht so sicher.
Funktionierte gut für das, was wir brauchten, obwohl, und sorgt dafür das script immer gestartet und ausgeführt werden dürfen, ohne Unterbrechungen.
InformationsquelleAutor der Antwort Christopher Lightfoot
Diese können von der Unterstützung sein, auch: Asynchrone shell-exec in PHP
InformationsquelleAutor der Antwort warren
Ich denke, shell_exec Befehl ist, was Sie suchen.
Es ist jedoch deaktiviert im abgesicherten Modus.
Im PHP-Handbuch Artikel darüber ist hier: http://php.net/shell_exec
Gibt es einen Artikel über ihn hier: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/
InformationsquelleAutor der Antwort
Es ist eine weitere option, die Sie verwenden können, führen Sie das Skript CLI...Es wird im hintergrund ausgeführt und Sie können sogar führen Sie es als cronjob, wenn Sie wollen.
e.g
Diesem setup kann als cronjob und wird ausgeführt, ohne zeitliche Einschränkung....diese Beispiele sind für unix-basierte Betriebssystem aber.
FYI
Ich habe ein php-script laufen mit einer Endlosschleife, die einige Verarbeitung und läuft für die letzten 3 Monate non-stop.
InformationsquelleAutor der Antwort Ronald Conco
Könnten Sie
ignore_user_abort()
- auf diese Weise wird das script weiterhin ausgeführt, selbst wenn Sie Ihren browser schließen oder wechseln Sie zu einer anderen Seite.InformationsquelleAutor der Antwort Greg
Denken deutscher
Offizielle website von Gearman
InformationsquelleAutor der Antwort Gowri
Neben bastiandoeen die Antwort, die Sie kombinieren können
ignore_user_abort(true);
mit einem cUrl Anfrage.Fake eine Anfrage Abtreibung wenn eine niedrige
CURLOPT_TIMEOUT_MS
und die Verarbeitung fortsetzen, nachdem die Verbindung geschlossen:NB
Profis
Nachteile
Ressourcen
curl timeout weniger als 1000ms immer fehlschlägt?
http://www.php.net/manual/en/function.curl-setopt.php#104597
http://php.net/manual/en/features.connection-handling.php
InformationsquelleAutor der Antwort RafaSashi
Zuk.
Ich bin mir ziemlich sicher, dass dies funktionieren wird:
Mit dem '&' ist wichtig. Es sagt der shell, nicht zu warten, für den Prozess zu beenden.
Auch Sie können diesen code in Ihrer php (als "bastiandoeen" gesagt)
in Ihren server beenden Befehl:
InformationsquelleAutor der Antwort Nader