2016-05-16 33 views
1

Ich verwende den Linux-Befehl nohup php filename.php &, um einen Hintergrund-PHP-Prozess zu erstellen. Das Problem hier ist, dass, wenn es irgendwelche Änderungen in den Dateien gibt, die in filename.php oder sogar die Datei selbst enthalten sind, ich den gegenwärtigen Prozess töten muss und ihn wieder anfangen muss. Gibt es eine Möglichkeit, dies zu verhindern, so dass bei der Codeaktualisierung kein Neustart erforderlich ist, weil ich keine Ausfallzeit (aufgrund des Beendens und Neustartens des Prozesses) in meiner Anwendung haben möchte. Wenn es keinen anderen Weg gibt, würde jemand einen alternativen Ansatz vorschlagen?Wie erstelle ich einen korrekten PHP-Hintergrundprozess?

EDIT 1

I ZeroMQ für die Kommunikation zwischen dem Hauptprozess, und dieser Prozess im Hintergrund verwenden. Der Hintergrundprozess bindet an einen bestimmten TCP-Port, sagen wir 555. Wenn ich nun versuche, einen neuen Prozess zu starten und ihn an den gleichen Port zu binden, gibt es einen Fehler, da der Port bereits verwendet wird. Und deshalb muss ich den Prozess beenden, bevor ich einen neuen starte.

EDIT 2

Bitte überprüfen Sie meine anderen question für in-dept Erklärung meiner kompletten Problem mit Beispielcode.

+0

Wie wäre es, einen neuen Prozess mit dem geänderten Code vor dem Töten des alten Prozesses zu starten? Würde das funktionieren – RiggsFolly

+0

@RiggsFolly Ich benutze ZeroMQ für die Kommunikation zwischen dem Hauptprozess und diesem Hintergrundprozess. Der Hintergrundprozess bindet an einen bestimmten TCP-Port, sagen wir 555. Wenn ich nun versuche, einen neuen Prozess zu starten und ihn an den gleichen Port zu binden, gibt es einen Fehler, da der Port bereits verwendet wird. Und deshalb muss ich den Prozess beenden, bevor ich einen neuen starte. –

+0

Das PHP-Skript wird beim Start der Ausführung einmal geladen. Es scheint keinen Weg zu geben. Wenn Ihr Hintergrundprozess eine konstante Schleife ist, können Sie den Code in der Schleife in eine andere Datei trennen und diese Datei über 'exec' oder' shell_exec' aufrufen, so dass Sie das Skript bei jeder Iteration neu laden müssen. – apokryfos

Antwort

1

Sie können Ihren Code nicht aktualisieren, während das Skript ausgeführt wird. PHP macht das nicht einmal, wenn es mit Apache ausgeführt wird. PHP überprüft jedoch, bevor eine neue Anfrage gestartet wird, ob der Code erneut geladen werden soll.

Wenn die Leistung kein großes Problem ist. Du könntest selbst etwas ähnliches tun. Lassen Sie ein Hauptscript (das nicht viel ändern muss) in der Warteschlange abhören. Und starten Sie ein zweites Skript mit proc_open zum Beispiel, um das zweite Skript auszuführen und die Daten über die Pipes zu serialisieren. Wann immer das zweite Skript verwendet wird, wird es für jede Anfrage neu geladen.