PHP Script in dauerschleife durchlaufen lassen

waterblade_xx

Cadet 3rd Year
Registriert
Aug. 2011
Beiträge
63
Hallo,

ich möchte, dass ein PHP-Script nicht ausgeführt wird, wenn es über den Browser aufgerufen wird, sondern Pausenlos im Hintergrund läuft.

Wie geht das ???

Kann ich da einfach eine Endlosschleife erzeugen - oder belastet das dann den Prozessor meines Servers ???

PS. Ich arbeite mit einem Linux System (CentOS)
 
Das wird nicht gehen, da es in den PHP-Settings ein Zeitlimit gibt, nach dem jedes noch laufende Skript abgebrochen wird. Dies ist auch eigentlich eine gute Idee, um Endlosschleifen zu verhindern. Ein deaktivieren dieses Zeitlimits würde ich somit nicht empfehlen. Ein Cronjob ist da definitiv die bessere Idee.
 
Doch, das geht sehr wohl. Das Zeitlimit gilt nur für PHP-Scripte, die entweder über ein Modul (z.B. Apache mod_php) oder CGI (z.B. PHP-FPM) gestartet wurden. Das Command Line Interface (CLI) schert sich überraschend wenig um die Limits, die in der PHP.ini gesetzt wurden bzw. kann die alle auch hübsch überschreiben.

Ein Hoch auf "php -q -f Script.php".

Sollte das Script in einem Ordner liegen, der vom Webserver aus erreichbar ist, dann macht sich folgendes Schnipsel ganz nützlich:
PHP:
if (PHP_SAPI !== 'cli')
{
	print_r("access restricted");
	exit;
}
Alternativ könnte man hier noch n passenden Header schicken etc...

Ich verwende das CLI z.B. um komplexe Bilder zu erzeugen. Wenn ich da n paar mehr Quell-Bilder als Input nutze und die Schleifen entsprechend lange laufen, dann tuckert das Teil gern mal 10-15 Minuten. Ist halt alles Single Core, außer man hat ne PHP-Implementierung, die Threads unterstützt (sehr selten)
 
Wenn ich in der Konsole "php -f blabla.php" eingebe, dann funktioniert alles so wie ich es wünsche.

Wenn ich dann das Konsolen Fenster schließe, dann wird quasi auch mein PHP-Script nicht mehr ausgeführt.

Wie kann ich das Script aufrufen, so dass es immer ausgeführt wird?
 
Mach einfach ein "&" ans Ende des Befehls. Ist zwar nicht elegant, sollte aber funktionieren. Zum beenden des Skriptes musst du dann aber umständlich "kill" und die Prozess-ID benutzen.
 
danke

ist das was ich mache eigentlich ungünstig für die Performance des Rechners ?
 
Kommt drauf an was du in der endlos schleife so alles machst.
Wenn du bspw jedesmal ne Datenbank Anfrage machst, dann dürfte es extrem auf die Performance gehen.
Du solltest ans Ende der schleife ein sleep() machen.
 
Ich möchte via WhatsApp API abfragen, ob ich in WhatsApp neue Nachrichten habe - und wenn JA, diese dann in eine MySQL Datenbank schreiben
 
Also in dem Fall halte ich es für die bessere Idee, dein Skript so umzubauen, dass es nur einmal auf neue Nachrichten prüft und sich dann beendet. Dieses Skript kannst du dann per cronjob z.B. alle 5 Minuten oder so aufrufen. Dann läuft dein Skript nicht die ganze Zeit. Darüber hinaus wird dann auch die Verbindung zum SQL-Server beendet, wenn sie nicht gebraucht wird.
 
Mit ziemlicher Sicherheit wird die Whatsapp-API eine Begrenzung der Anfragen haben und irgendwann einfach blockieren.
Da könnte schon ein sekündlicher Abruf zuviel sein.

Ein Cronjob wäre hier wohl wirklich die bessere Alternative.
 
Jep, das ist definitiv ein Fall für Cron. Muss man denn wirklich jede Sekunde wissen, obs neue Nachrichten gibt? Reicht da nicht ein Minuten-Takt oder einmal alle 5 Minuten?
Ein tatsächlich endlos laufendes Script macht eher Sinn, wenn man Sockets bereit stellen will oder sowas.
 
Zurück
Oben