Ihr kennt das vielleicht. Es gibt PHP-Scripte, die müssen immer und immer wieder ausgeführt werden. Meistens dann als Cronjob. Das ist okay, solange dieses Script korrekt durchläuft (und sich somit "selbst" beendet). Manchmal kommt es dann aber vor, dass dieses Script länger braucht als vorgesehen; z. B. weil es auf andere Prozesse warten muss.
Beispiel: Ihr habt ein Script, dass - per CJ definiert - alle 10 Minuten prüft, ob ein bestimmter neuer Eintrag in der DB vorhanden ist. Das sollte im Normalfall sehr schnell gehn (wenige Sekunden ...) . Wenn es aber z. B. zu Problemen mit der DB-Verbindung kommt (weil in der DB bereits andere Requests ausgeführt wurden, die alle weiteren Anfragen blocken) kann es passieren, dass euer Script dann auf einmal weit länger als die vorgesehenen paar Sekunden benötigt. Im schlimmsten Fall sogar länger als die angegebenen 10 Minuten. Und dann ham'wer den Salat: Euer Script wird immer und immer wieder gestartet, obwohl ältere Prozesse des Scriptes noch gar nicht beendet wurden.
Damit euch euer Admin nicht irgendwann auf die Finger klopft, gibt es hier eine recht einfache Lösung: Schreibt den folgenden Code einfach in eine include-Datei, die ihr dann in jedes Script einbaut, was nicht mehr als 1 Mal parallel laufen darf:
$runningScript = $_SERVER['SCRIPT_NAME'];
if( !empty($runningScript) ) {
// Pruefe wie oft das Hauptscript schon laeuft
// Alle weiteren Ausgaben werden dabei ignoriert
$output = shell_exec("ps ax | grep {$runningScript} | grep -v grep | grep -v bash | grep -v bin/sh| wc -l");
// Ergebnis groesser 1: Script laeuft bereits
// 1 wird immer geliefert, da das Script sich selbst auch sieht
if( (int)$output > 1 ) {
exit;
}
}
Keine Kommentare:
Kommentar veröffentlichen