Ja, man kann PHP als Hintergrundprozess, unabhängig vom Browser laufen lassen.
Der Browser macht einen Request. Der Server liefert eine Response, die der Browser anzeigt. Der Server startet zusätzlich einen http-Request im Hintergrund, der unabhängig vom Browser weiterläuft. Wenn der Browser den Request beendet (Stopp-Button), dann läuft der Hintergrundprozess trotzdem weiter.
Hauptscript vom Browser aufgerufen, php_fork_main.php:
echo "<p>start\n"; echo "<p>calling background process\n";
############################################################## $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, 'http://localhost/php_fork_background.php'); curl_setopt ($ch, CURLOPT_TIMEOUT, 1); curl_setopt ($ch, CURLOPT_POST, false); curl_setopt ($ch, CURLOPT_FRESH_CONNECT, true); curl_exec ($ch); curl_close($ch); ############################################################## echo "<p>background process called\n"; echo "<p>end.\n";
Hintergrundscript, php_fork_background.php:
ob_end_clean(); header("Connection: close\r\n"); header("Content-Encoding: none\r\n"); ignore_user_abort(true); // optional set_time_limit(0); // run script until it finish ob_start(); echo ('<p>Text from background process starting'); $size = ob_get_length(); header("Content-Length: $size"); ob_end_flush(); // Strange behaviour, will not work flush(); // Unless both are called ! ob_end_clean(); ##################################### # background task ##################################### echo "<p>background process running, this output is not visible"; for($i=0; $i<10; $i++) { $data = date("H:i:s") . " - $i\n"; file_put_contents('fork_background.log', $data, FILE_APPEND); sleep(10); }
Mit dank an http://www.ivankristianto.com/….