PHP Service/Deamon

Hi Leute,

mich drückt seit einiger Zeit eine Frage.

Wie würde man einen Service/Deamon in PHP realisieren. Also keinen WebService, der requests bearbeitet, sondern einen Service im Sinne eines Windows Services, oder eines Deamons auf Linux Systemen.

Bei anderen Projekten regelte ich das immer so, dass ich die Funktionen die von dem Service/Deamon erledigt werden sollten (prüfung auf updates, onlinestatus, usw) mit in meinen Core gescriptet habe, damit sie „regelmäßig“ ausgeführt werden, wenn irgend ein User den core antriggert, was so ziemlich oft passiert.

Jetzt hab ich hin und wieder das Problem, dass entweder mal gar kein User etwas macht, oder die User auch mal gleichzeitig auf die backbone triggern, und sich bei einigen Funktionen die Arbeitsschritte überschneiden. So kommt es alle heiligen drei Könige mal vor, dass mir mein „Service/Deamon“ die Daten vermurkst. Ich habe mir mitlerweile SQL-Prozeduren gebaut, die genau diese fehlerhaften Daten suchen und sie bereinigen, aber das ist ja auch nicht das Gelbe vom Ei.

Jetzt komme ich zu meiner Frage:
Ist es möglich, und wenn, wie würde man es realisieren, dass man sozusagen so einen Service/Deamon baut, der unabhängig von der ganzen laufenden Seite im Hintergrund läuft. Also getrennt von den Handlungen der Seite z. B. alle 5 Minuten Funktionen ausführt.

So könnte man regeln, dass auch ohne dass ein User die Applikation besucht, der Service/Deamon getimed alle 5 Minuten eine Prüfung auf die DB fährt.

Kann man so etwas machen? Was sind eure Erfahrungen?

wäre froh über Anworten!

lg

der kleine Artur

Hi zurück,

Stichwort: Cronjob.

Gruß, remy

Hallo,

das ist Aufgabe des Servers. Dafür gibt es unter Linux Cron und unter Windows Aufgaben. Frag Google mal danach.

Da ich selbst meine Webseiten auf meinem eigenen Server hoste, kann ich leider nicht einschätzen, ob andere Hoster so etwas auch anbieten. Wenn deiner kein Cron bieten kann wird es leider schwierig. Dann kann man höchstens versuchen, das Skript so zu ändern, dass es beim Start eine Art „Lock“ generiert und diesen beim Ende wieder entfernt. Einfach einen booleschen Wert namens „Laeuft“ in der Datenbank zu setzen bzw. abzufragen könnte schon reichen…

Mit freundlichen Grüßen,

frozen

Versuch es mal mit einem „cronjob“.
MfG
uwe


Wie würde man einen Service/Deamon in PHP realisieren. Also
keinen WebService, der requests bearbeitet, sondern einen
Service im Sinne eines Windows Services, oder eines Deamons
auf Linux Systemen.

Bei anderen Projekten regelte ich das immer so, dass ich die
Funktionen die von dem Service/Deamon erledigt werden sollten
(prüfung auf updates, onlinestatus, usw) mit in meinen Core
gescriptet habe, damit sie „regelmäßig“ ausgeführt werden,
wenn irgend ein User den core antriggert, was so ziemlich oft
passiert.

Jetzt hab ich hin und wieder das Problem, dass entweder mal
gar kein User etwas macht, oder die User auch mal gleichzeitig
auf die backbone triggern, und sich bei einigen Funktionen die
Arbeitsschritte überschneiden. So kommt es alle heiligen drei
Könige mal vor, dass mir mein „Service/Deamon“ die Daten
vermurkst. Ich habe mir mitlerweile SQL-Prozeduren gebaut, die
genau diese fehlerhaften Daten suchen und sie bereinigen, aber
das ist ja auch nicht das Gelbe vom Ei.

Jetzt komme ich zu meiner Frage:
Ist es möglich, und wenn, wie würde man es realisieren, dass
man sozusagen so einen Service/Deamon baut, der unabhängig von
der ganzen laufenden Seite im Hintergrund läuft. Also getrennt
von den Handlungen der Seite z. B. alle 5 Minuten Funktionen
ausführt.

So könnte man regeln, dass auch ohne dass ein User die
Applikation besucht, der Service/Deamon getimed alle 5 Minuten
eine Prüfung auf die DB fährt.

Kann man so etwas machen? Was sind eure Erfahrungen?

wäre froh über Anworten!

hoi,

grundsätzlich kannst du meiner meinung nach zwei dinge machen.

  1. du lässt einen cronjob laufen, der deine trigger abfackelt
  2. du schreibst einen deamon mit c/c++ und lässt ihn auf deinem server laufen, und fragst dann per php die ergebnisse ab/verarbeitest sie

problematisch kann es bei der deamon geschichte nur werden, wenn du keine eigene maschine besitzt. ein hoster wird dir ziemlich sicher nicht erlauben, dein kernel/services so anzupassen, dass sie mit einem eingriff auf nativer/systemebene einhergehen…

greetz, me

Ähm, warum legst du keinen Cron Job an? Einfacher geht es nicht.

Man kann dafür einen Cronjob anlegen, der läuft dann regelmäßig wie er eingestellt ist.

Beste Grüße

Friedrich Hofmann

Hallo,

Das kommt darauf an, welche Vorraussetzungen man hat.
Wenn du einen Linux-Server hast, auf den du zugriff hast, kannst du das ganze per Cronjob erledigen. zB alle 5 Minuten per Lynx (Linux-Kommandozeilen-Browser) oder PHP-CLI ein PHP-Script ausfuehren.

Unter Windows per Geplante Tasks.

Dafuer einen Kompletten Deamon/Service zu bauen ist eher interessant, wenn es um permanent arbeitende Sachen geht oder dauerhaft auf einem Port gelauscht werden soll.

Solltest du nur einen Webspace benutzen, auf dem du keine Möglichkeit hast per Cron oder „Geplante Tasks“ regelmässig ein Script aufrufen zu lassen, kannst du auch sogenannte „Cron Services“ in Anspruch nehmen (einfach bei google mal danach suchen).

Sind Seiten die den Service bieten regelmaessig Webseiten aufzurufen. zB halt dein „Trigger-Script“.

Solltest du noch weitere Fragen dazu haben, melde dich einfach :smile:

MfG
Sascha

Jetzt komme ich zu meiner Frage:
Ist es möglich, und wenn, wie würde man es realisieren, dass
man sozusagen so einen Service/Deamon baut, der unabhängig von
der ganzen laufenden Seite im Hintergrund läuft. Also getrennt
von den Handlungen der Seite z. B. alle 5 Minuten Funktionen
ausführt.

So könnte man regeln, dass auch ohne dass ein User die
Applikation besucht, der Service/Deamon getimed alle 5 Minuten
eine Prüfung auf die DB fährt.

Kann man so etwas machen? Was sind eure Erfahrungen?

Ergänzend will ich noch erwähnen, dass ich mit beiden Methoden (Windows und Linux) um Aufgaben nachts abzuarbeiten und Auswertungen anzufertigen.

Hallo Arthur,

sowas würde man nicht in PHP machen, sondern als script, dass dann per cronjob oder sceduler ausgeführt wird.

Grüße

Micha

Hi,

das sollte machbar sein.
Was du brauchst ist die Funktion, die unter Windows vom Taskplaner bereitgestellt wird. Die Linux-Variante dazu heißt Cron. Damit kannst du genau angeben, in welchem Interval dein Script ausgeführt wird.
Die config-Dateien dazu findest du unter /etc/cron.* (wobei ich den * hier als Platzhalter benutzt habe).
Wenn du root bist, kannst du auch die /etc/crontab verwenden.
Schau mal hier:
http://de.wikipedia.org/wiki/Cron
Da steht auch, welches Feld in der crontab was bedeutet.

Viel Erfolg

Hallo,

sowas kann man mit einem Cronjob wunderbar automatisieren.

die einfachste Lösung wäre, das ganze mit einem Cronjob auf dem Server regelmässig zu starten.

Ansonsten müsste man die Datei aufrufen, alles abarbeiten, dann am schluss einen Sleep von z.b. 300 Sekunden einbauen, und dann als letztes sich selbst wieder aufrufen.

Viel Erfolg

hi,

da kann ich dir leider auch nicht weiterhelfen.

cu
harald
*************

Hallo Artur,

PHP ist ja generell erstmal als „Scriptsprache“ konzeptioniert und umgesetzt worden. Es ist optimiert auf kurze „lebensdauer“, ein Request - abarbeitung - fertig. So etwas, was du bauen willst kannst du entweder über eine andere Sprache z.B. node.js oder Ruby Shellscript basteln, oder du konfigurierst ein cronjob, der dein php Script alle 5 Minuten anstößt.

Alternative könntest du auch ein Queue System nutzen (z.B. http://www.rabbitmq.com/) und und der Job legt sich Zeitverzögert einfach wieder in die Queue.

Ohne diese ganzen Hilfsmittel würde wirklich nur eine Endlosschleife funktionieren.

Beispiel: https://gist.github.com/casparjones/5058435

mit „php daemon.php -d &“ startet man den daemon.
mit „php daemon.php -sayhallo“ gibt er „Hallo“ aus
mit „php daemon.php -exit“ wird der daemon beendet

Aber das ist nicht so schön und vor allem nur auf der linux welt möglich, da man dort Prozesse im Hintergrund laufen lassen kann.

Es gibt auch PHP Intern die Möglichkeit Prozesse zu erzeugen:
http://www.php.net/manual/de/function.proc-open.php

Damit kenne ich mich nur nicht so gut aus.

Viele Grüße
Frank