Frage

Was ist der beste Weg, um ein PHP-Skript als Daemon laufen zu lassen, und wie kann man am besten prüfen, ob ein Neustart erforderlich ist?

Ich habe einige Skripte, die rund um die Uhr ausgeführt werden müssen, und die meisten davon kann ich damit ausführen neinhup.Aber wenn sie ausfallen, wie kann man sie dann am besten überwachen, damit sie automatisch neu gestartet werden können?

War es hilfreich?

Lösung

Wenn Sie dazu nicht die (richtige) Init-Struktur verwenden können (Sie nutzen Shared Hosting usw.), verwenden Sie cron, um alle paar Minuten ein Skript auszuführen (es kann in einer beliebigen Sprache geschrieben sein), das überprüft, ob dies der Fall ist Überprüfen Sie, ob sie ausgeführt werden, und starten Sie sie bei Bedarf neu.

Andere Tipps

Wir führen unsere Daemons aus, indem wir die Ausgabe an Mail weiterleiten.

php daemon.php | mail -s "daemon stopped" foo@example.org

Wenn der Daemon stoppt, sendet er auf diese Weise eine E-Mail und wir werden auf diese Weise benachrichtigt.

Es bedeutet natürlich immer noch einen manuellen Neustart der Daemons, aber wir werden es sofort wissen.Wenn die Daemons gestoppt sind, bedeutet das normalerweise, dass noch etwas anderes erledigt werden muss, also ist das normalerweise in Ordnung.

Quick and Dirty Cron zum Neustarten Ihres Daemons:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

Ersetzen Sie USER durch den Benutzer, unter dem der Daemon ausgeführt wird, und SCRIPTNAME durch den Namen Ihres Skripts.Steck das rein /etc/cron.d/restart_php_daemon.Es sollte jede Minute laufen.Ändere das erste * Zu */2 oder */5 weniger häufig laufen.

AKTUALISIEREN

Wenn Sie dies in Ihre eigene Crontab einfügen:

Laufen crontab -e und füge hinzu:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

Die eleganteste Lösung ist phpdaemon oder reagierenPHP.

Ich hatte Erfolg damit, ein Wget auszuführen und das Ergebnis an /dev/null auf einem gemeinsam genutzten Server zu senden.

Daemon ist ein Linux-Prozess, der im Hintergrund läuft;Apache oder MySQL sind Daemons.In einer Linux-Umgebung können wir ein Hintergrundprogramm mit Cronjob ausführen, aber es gibt einige Einschränkungen und in manchen Szenarien ist es keine gute Idee.Mit Cronjob können wir beispielsweise nicht kontrollieren, ob die vorherige Ausführung bereits abgeschlossen ist.Daher ist es oft bequemer, einen Prozess als Daemon auszuführen.

// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print "Parent : " . getmypid() . " exiting\n";
     exit();
}
print "Child : " . getmypid() . "\n";

Der obige Code stammt aus einem sehr guten Artikel über die Erstellung eines Daemons in PHP.Dies können Sie hier nachlesen Verknüpfung

Ich verwende ein PHP-basiertes Skript, um aus einer Datenbank zu lesen und E-Mails zu versenden (unter Verwendung der PEAR Mail_Queue-Bibliothek).Ich führe es innerhalb eines Bash-Skripts aus und basierend auf dem zurückgegebenen Ergebnis (von „exit $status;“) entweder anhalten, X Sekunden in den Ruhezustand versetzen oder sofort neu starten.(Ich habe auch eine Überprüfung des Lastdurchschnitts/Ruhezustands in das PHP-Skript eingebaut, um eine Überlastung des Mailsystems zu vermeiden.)

Wenn es sich um einen langfristigen Daemon handeln würde, der ständig laufen müsste, dann stimme ich zu, dass es wahrscheinlich nicht das Beste wäre, diesen laufen zu lassen (obwohl ich von einigen Socket-Servern gehört habe, die langfristig erfolgreich liefen), aber PHP 5.3 verfügt jetzt auch über eine verbesserte Garbage Collection, und wenn das Skript gut genug geschrieben ist, um es nicht ungeplant zu beenden, sollte der Speicher ein weitaus geringeres Problem darstellen als zuvor.

Ich stimme zu, dass PHP dafür nicht das beste Tool ist, kann jedoch verstehen, warum Sie PHP verwenden möchten, damit Sie Komponenten aus Ihrer Anwendung wie Datenbankzugriff usw. wiederverwenden können.

Ich hatte ein ähnliches Problem und habe schließlich The Fat Controller entwickelt, einen in C geschriebenen Daemon, der PHP-Skripte ausführen kann.Es kann auch als Multithread-Daemon ausgeführt werden, der viele Instanzen eines Skripts parallel ausführt.

Weitere Informationen und Anwendungsfälle finden Sie hier: http://www.4pmp.com/fatcontroller/

TBH, PHP ist dafür wahrscheinlich nicht das beste Werkzeug, wirklich nicht das, wofür es entwickelt wurde.Ich habe von Speicherlecks und anderen schlimmen Dingen gehört, die passieren, wenn Sie das versuchen.Bedenken Sie auch, dass PHP pro Ausführung eines Skripts nur über eine begrenzte Anzahl an Ressourcen-IDs (für Dateihandles, Datenbankverbindungen usw.) verfügt.

Verwenden Sie besser etwas anderes, vielleicht Python oder Perl. Ich habe zwar keine wirkliche Erfahrung mit dem Schreiben dieser Art von Apps, weiß aber, dass PHP nicht für das geeignet ist, was Sie versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top