So halten Sie eine permanente PHP-Skript ausgeführt?
Ich habe ein PHP-script wartet auf eingehende socket-Anfragen, etc. Ich brauche dieses Skript ständig laufen (es läuft in einer Endlosschleife) auf dem server.
Wie kann ich initiieren und managen diesen Prozess? Ich habe versucht, gerade in dem Sie ihn starten über SSH/putty aber sobald die SSH-Verbindung mal das Skript stirbt.
- mögliche Duplikate von php-Skript als daemon-Prozess
- Viele gute Infos: stackoverflow.com/search?q=php+daemon
- überprüfen Sie "screen" utility sowie das trennen Ihrer Sitzung vom ssh (und schließen Sie es später, wenn Sie wollen)
- Wenn Sie einen lang Laufenden php-Skript als Lösung, dass man entweder ein wissenschaftliches problem, eine merkwürdige Reihe von Umständen, oder auf einem Weg zu einer besseren Lösung, wenn Sie Ihren Kopf um ihn herum. Zurück zum Thema, auf einer abstrakten Ebene, die Sie wollen, dass etwas verwalten Sie Ihre php-Prozess neu zu starten, wenn es stirbt, geht oom, der Mond verschiebt Ausrichtung, etc. (dieser manager sollte sich nicht ein weiteres php-Skript) 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diesem laufen die scriptin hintergrund
können Sie es mit
Als Patrick erwähnt hat unten in den Kommentaren, es gibt keine maximale Ausführungszeit für PHP-Skripte von der Kommandozeile aus ausgeführt.
myscript.php
wird auf unbestimmte Zeit laufen.set_time_limit
.Wir hatten vor kurzem ein ähnliches Bedürfnis. Wir laufen ein Ubuntu-14.04 LTS-server, so erstellt eine
upstart
Prozess um den Prozess zu starten beim Booten als und neu gestartet, wenn es aus irgendeinem Grund beendet.Es hat sich für uns sehr gut, einschließlich der automatischen Neustart; der lang andauernde Prozess schließlich verliert die MySQL-Verbindung. Das Skript behandelt die Ausnahme und wird beendet, bevor die
upstart
Prozess automatisch neu startet den Prozess. Wir haben auch Hinzugefügt, einecron
Skript, um den Prozess überwachen, nur, falls es einen größeren Fehler, dassupstart
gibt den Versuch neu zu starten; wir haben eine fail-safe in dem Falle, dass ein einfacher Neustart nicht, korrigieren Sie die vorherigen Fehler.Führen Sie das Skript in den hintergrund über SSH wie hier beschrieben: Erste ssh ausführen eines Befehls im hintergrund auf den Ziel-Maschine
Ich würde dann schlagen Sie einen Weg, um zu überwachen, ob das Skript noch läuft. Sie haben erwähnt, Ihr Skript auf einem port lauscht, könnte man vielleicht ein Skript schreiben, das überprüft, jeder einmal in eine Weile zu sehen, ob der port noch offen.
Weitere option ist für die überwachung der Prozess-id. Wenn das Skript zuerst ausgeführt wird, kannst du dir die Prozess-id mithilfe
getmypid
- Funktion und speichern Sie in einer Datei. Sie können dann in regelmäßigen Abständen überprüfen, ob es noch läuft mitps -p 1234
.Andere Lösung: Wie um zu überprüfen, ob ein php-script läuft immer noch
Können Sie den browser nutzen, wenn Sie ignore_user_abort() und set_time_limit()
Können Sie ihn ausführen-Befehlszeile. Sie haben, um eine "im hintergrund laufen" - Modifikator um zu machen, so dass das system nicht warten, bis das Skript abgeschlossen ist. Im Grunde setzen Sie ein & am Ende der Befehlszeile.
Eine Sache, die Sie sollten auf jeden Fall tun, ist erstellen Sie eine ini-shell-Skript, das ausgeführt wird das PHP-Skript wird beim Booten incase jedem Neustart.
Wenn lang andauernde Zuverlässigkeit ist das Ziel dann, supervisord ist perfekt dafür!!!!
Ich über Sie kam über https://lornajane.net/posts/2012/watch-over-long-running-processes-with-supervisord
Edit: Das tool hat den Zweck, zur Lösung der gestellten Aufgabe. Das erklärte Ziel ist es, die lang andauernde Prozess läuft. Ein Kommentar hingewiesen (gültig), dass die derzeit akzeptierte Lösung wird nicht zuverlässig sein, wie das Skript wird wahrscheinlich zu einem Absturz etc. Also die Lösung ist ein Werkzeug zu verwenden, um "zu initiieren und zu verwalten, diesen Prozess", der auch hält Sie am Leben. Dieses tool macht genau das: es startet den Prozess im hintergrund und hält, dann läuft es.
Warum nicht eine do-while-Schleife?
do { /* your code */} while $something == 0;
Dann, wenn etwas passiert, ausgelöst durch den Stillstand der Skript, Satz $etwas zu einem anderen Wert als 0.
$something = 0;
ist eine Zuordnung und nicht um eine true/false zu testen .. 😉 Aber ich bin mir sicher, dass Sie wusste, dass .. eine Andere Sache ist, dass, wenn Sie base-alles auf einem loop-Szenario, es sei denn, Ihre Logik ( Skript / Funktion ... was auch immer ) Blöcke auf etwas - alle Schleifen, während "Leerlauf" nicht im Leerlauf, sondern belasten die server-cpu zu verschwenden wertvolle Ressourcen, die Sie auf einem server-weiten oder zumindest virtuellen-server-breiten Anwendungsbereich.