PHP-CLI Scripte überwachen mit Websockets

Jeder der schon einmal PHP-Scripte mit sehr langer Laufzeit verwendet hat, weiss dass es nicht ganz einfach ist solche Scripte zu überwachen. Natürlich kann man in der Prozessliste des Servers schauen ob die Scripte noch laufen, es ist jedoch schwierig zu bestimmen was ein Script gerade tut.

Eine Möglichkeit dies herauszufinden ist das Logging in eine Datei oder Datenbank. Das kann sinnvoll sein wenn man später nachvollziehen möchte was ein Script zu welchem Zeitpunkt getan hat. Wenn man jedoch überwachen möchte was ein Script gerade im Moment tut ist diese Variante relativ unpraktisch. Man müsste dazu die Log-Datei bzw. die Ausgabe aus der Datenbank permanent neu laden.

Wunderbar geeignet für ein „Live-Monitoring“ von Scripten mit langer Laufzeit ist ein „Websocket-Konsole“. Hierzu binde ich einen Websocket-Client in meine Scripte ein und halte ständig die Verbindung zu einem Websocket-Server. Die Scripte senden nun in regelmäßigen Abständen eine Statusmeldung an den Websocket-Server. Wichtige Ereignisse oder Fehlermeldungen werden ebenfalls an den Websocket-Server gesendet. Wenn ich nun den Status der Scripte einsehen möchte rufe ich einfach im Browser die entsprechende Applikation des Websocket-Servers auf und die Statusmeldungen werden live angezeigt. Wenn kein Browser mit dem Server verbunden ist verpuffen die Meldungen im digitalen Nirvana. Natürlich wäre auch ein zusätzliches Logging dieser Meldungen denkbar.

Einige „Stolpersteine“ sollte man jedoch bei der Umsetzung eines solchen „Websocket-Loggings“ beachten:

  1. Sollte der Websocket-Server abstürzen oder aus einem anderen Grund nicht erreichbar sein, so sollte diese keine weiteren Auswirkungen auf die überwachten Scripte haben. Sprich: Sollte eine Nachricht nicht an den Server gesendet werden können, so sollte Script nicht mit einem Fatal-Errror etc. abbrechen.
  2. Sollte die Verbindung zum Websocket-Server unterbrochen werden so sollte in regelmäßigen Abständen versucht werden diese wieder aufzubauen. Passiert dies nicht so müssten die Scripte nach jedem Verbindungsabbruch neue gestartet werden.

Zum Schluss noch eine Idee die ich bisher selbst noch nicht getestet habe: Mit den neuen Audio-Features von HTML5 könnte man bei bestimmen Ereignissen in den Scripts sogar akustische Signale im Browser auslösen. So könnte man z.b. auf schwerwiegende Fehler hinweisen die ein sofortiges Eingreifen erfordern.

Für alle die Interesse haben selbst an einer solchen Websocket-Console zu basteln, habe ich hier die wichtigsten Dateien meiner Applikation hinterlegt: https://gist.github.com/2950185