Hello Sabine,
da die Frage nun sachon öfter kam, hier meine kliene Musterlösung, um ein Script in den Hintergrund zu stellen und trotzdem nicht die Kontrolle darüber zu verlieren.
Das Script word nicht abgebriochen, solange im sleben Verzeichnis eine Datei 'lauf.txt' vorhandne ist.
Das Script läuft endlos weiter, auch wenn das Browserfenster geschlossen wird.
Das Script legteine Logdatei unter dem Namen lauflog.html an. Dort wird aller zwei Minuten ein Kontrolleintrag hinterlassen.
Für Die Verwendung als Mail-Treiber kann es natürlich auch in einer DB seine Spuren hinterlassen und die Mails als gesendet markieren.
Wenn man die Datei lauf.txt löscht, wird das Script angehalten.
Der Prozess kann auch aktiv sein, wenn _keine_ lauflog.html erzeugt wird. Das liegt dann ggf. daran, dass die Datei im Verzeichnis nicht erstellt werden darf.
Obwohl bei eingeschaltetem SafeMode eine Warnung kommt, dass set_time_limit() nicht benutzt werden darf, wird das Script ausgeführt.
Wenn man im Verzeichnis eine .htaccess anlegen darf und die Veränderung von limits erlaubt sind, kann man mittels
php_value max_execution_time '0'
die Zeitbegrenzug abschalten.
---------------------------------------------------------------------------
<?php #### background_control.php ####
error_reporting(E_ALL);
ini_set("track_errors","1");
$php_errormsg ='';
set_time_limit(0);
$pid = getmypid();
$ignore = ignore_user_abort(true); ## Script läuft bei abort weiter
echo "<p>Schleife gestartet mit $pid</p>\n";
echo str_repeat(" ", 256);
flush();
clearstatcache();
diese Schleife läuft solange, wie eine Datei lauf.txt vorhanden ist
while (file_exists('lauf.txt'))
{
$message = "Prozess $pid ".date('Y-m-d H:i:s')." lebt noch<br />\n";
$log = error_log ( $message, 3, 'lauflog.html'); ## das kann man auch auf einaml pro Stunde
sleep(120); ## reduzieren
## error_log() verursacht keinen Fehler, wenn Verzeichnis oder File nicht writable sind
## hier prüfen, was zu tun ist und dann über die Ausführung einen Log-Eintrag schreiben
## Die Aufgabe kann man auch über fsockopen() nach derselben Methode starten
## Nach dem fclose() läuft das Script dann weiter...
}
$log = error_log ("Prozess $pid wird beendet: ".date('Y-m-d H:i:s')."<br />\n", 3, 'lauflog.html');
echo "Script $pid beendet<br />\n";
?>
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau