PHP-Skript als Daemon laufen lassen

Mordor

Registered User
Moischen
Ich seh mich ja schon fast gelüncht hier rumliegen, hätte da aber trotzdem mal ne Frage:

Kann man ein PHP-Skript als Daemon laufen lassen?

Ein Skript auf der Komandozeile auszuführen ist ja kein Problem, aber kann man es auch als Daemon laufen lassen, das wäre eben die Frage.
Tante Google hab ich schon bemüht. Da kommen zwar ein paar Sachen, aber mit vielen kann man nichts anfangen.

Wär also nett, wenn jemand nen Tip hätte.

Gruß Mordor
 
Einfache Antwort: Ja!

Die Frage ist, was man damit machen will.
Wenn er auf reinkommende TCP-Verbindungen lauschen soll gibt es zwei Methoden:
a) per (x)inetd.
Damit ist der eigentliche Daemon dann der inetd und Dein Script muß lediglich von STDIN lesen und auf STDOUT schreiben.

b) standalone:
Das Daemonizing muß dann im Startscript erfolgen (z.B. mit "&", nohup, daemontools, oder distributionsabhängigen Tools).
Dann kann man darin eine Endlosschleife bauen, die z.B. auf einen vorher gebundenen Port auf Connection wartet. Oder irgendetwas anderes tut...
Wichtig ist, daß das Script die üblichen Signal-Handler installiert um die Schleife gefahrlos zu verlassen. Sonst braucht man immer ein kill -9 um den Prozess zu beenden.


Für andere Anwendungen die also nicht erwachen, wenn eine TCP/UDP-Verbindung rein kommt (wie z.B. sowas wie Cronjobs oder Serverüberwachung...) kommt eh nur b) in Frage.

huschi.
 
Danke schon mal für die Antwort.

Generell gehts darum, dass ich den Traffic für FTP überwachen möchte, was über eine Auswertung des FTP-Logfiles laufen soll. Das ganze sollte dann eben als Daemon laufen, da man dann in Echtzeit den Traffic miitloggen kann, und nicht wie über ein mit Cron aufgerufens Skript alle paar Minuten.

Werd mich mal auf die Suche im Netz machen, ob ich zu deinen Anhaltspunkten was finde.

Gruß Mordor
 
Nun bin ich nen Schritt weiter:
Also, ich bau mir ein Startskript, was ich beispielsweise über
Code:
/etc/init.d/scriptname start
starten kann. Bei start erstellt das Startskript eine PID-Datei und startet das PHP-Skript mit der nohub funktion, um es aus der laufenden Shell rauszunehmen.
Im PHP Skript gibt es dann eine While-Schleife, die ich auf
Code:
while(TRUE)
setze. So wird diese immer wieder durchlaufen. In der While-Schleife wird überbrüft ob es das PID-File noch gibt. Ist das der Fall, läuft diese ganz normal weiter, ist das nicht der Fall, wird die While-Schleife unterbrochen und das Skript läuft aus.

Rufe ich mein Shell-Skript mit
Code:
/etc/init.d/scriptname stop
wird die PID Datei gelöscht. So kann die While-Schleife sehen, dass das Skript beendet werden soll.

Lieg ich damit jetzt richtig, oder ist das nicht sehr elegant, bzw. gibt es da noch andere Möglichkeiten?

Ausserdem stellt sich mir noch eine Frage:
Wenn ich in der While-Schleife ein sleep von 10 Sekunden drin hab, dann muss ich ja im schlechtesten Fall 10 Sekunden warten, bis das Skript beendet wird. Gibt es hier ne bessere Lösung?

Danke schon mal für die Hilfe.

Gruß Mordor
 
Oberer Teil:
Es kommt drauf an, wie Du es implementierst. So wie Du es beschreibst, klingt es nach einer CPU-Lastigen Art und Weise.

Grundsätzlich sollte ins PID-File die PID des Prozesses der wirklich läuft, so daß er mit "kill `cat file.pid`" killbar ist.
Außerdem verlässt Du Dich mit diesem Weg darauf, daß Dein PHP-Script nicht Amok läuft.

Und nun zur eleganteren Art:
Auch in PHP kann man Signal-Handler installieren. Diese Handler werden aufgerufen, sobald ein "kill [-SIG] [pid]" abgesetzt wird. Die std. Signal, die man abfangen sollte ist der HUP (Soft-Reload == "bitte die Conf neu einlesen") und der TERM (terminate == "bitte beende Dich selber"). Den KILL ("kill -9") bekommt ein Prozess meistens gar nicht zu spüren.

D.h. Dein PHP-Script braucht bei installierten Sig-Handlern nicht ständig auf der Platte rumfahren, sondern z.B. nur nach globalen Variablen schauen, die von Sig-Handler gesetzt werden.

Dein Startscript kommt dann mit einfachen kill-Befehlen für "reload" und "stop" aus.

huschi.
 
Meiner Meinung nach gibt es ja nur genau einen Grund, einen Daemon in PHP zu implementieren: Man hat eine Applikation, die in PHP geschrieben ist und will Klassen gemeinsam benutzen.

Für diesen Fall wäre das Perl-Modul File::Tail interessant. Überhaupt halte ich Perl für die Auswertung von Logzeilen für die überlegenere Sprache.
 
@ Huschi
Danke erst mal. Das bringt mich auf jeden Fall schon mal weiter.

@Elias
Ich würds ja gern in Perl schreiben, nur leider bin ich der Sprach nicht mächtig. Wobei ich mich da mal reinarbeite wenn ich genügend Zeit dazu hab. Im moment ist halt PHP das was ich gut kann. Und das ist auch der Grund, warum ich es in PHP schreibe.
 
Back
Top