set_time_limit(0); // 取消腳本運行時間的超時上限
后台運行的后面還要,set_time_limit(0); 除非在服務器上關閉這個程序,否則下面的代碼將永遠執行下去止到完成為止。
如果程序運行不超時,在沒有執行結束前,程序不會自動結束的.
//PHP 中如何 在客戶端觸發,然后在服務器端執行一個函數,頁面關閉也繼續執行。要先返回用戶請求不要等待時。
ob_end_clean();#清除之前的緩沖內容,這是必需的,如果之前的緩存不為空的話,里面可能有http頭或者其它內容,導致后面的內容不能及時的輸出
header("Connection: close");//告訴瀏覽器,連接關閉了,這樣瀏覽器就不用等待服務器的響應
header("HTTP/1.1 200 OK"); //可以發送200狀態碼,以這些請求是成功的,要不然可能瀏覽器會重試,特別是有代理的情況下
//return false;//加了這個下面的就不執行了,不加這個無法返回頁面狀態,瀏覽器一直在等待狀態,可以關閉,但不是要的效果。
//die(); 或 return ;也一樣不執行下面的
//rundata();
//register_shutdown_function("rundata");
//return ;
ob_start();#開始當前代碼緩沖
echo "running,,,,.";
//下面輸出http的一些頭信息
$size=ob_get_length();
header("Content-Length: $size");
ob_end_flush();#輸出當前緩沖
flush();#輸出PHP緩沖
#休眠PHP,也就是當前PHP代碼的執行停止,1秒鍾后PHP被喚醒,
#PHP喚醒后,繼續執行下面的代碼,但這個時候上面代碼的結果已經輸出瀏覽器了,
#也就是瀏覽器從HTTP頭中知道了服務端關閉了連接,瀏覽器將不在等待服務器的響應,
#反應給客戶的就是頁面不會顯示處於加載狀態中,換句話說用戶可以關掉當前頁面,或者關掉瀏覽器,
#PHP喚醒后繼續執行下面的代碼,這也就實現了PHP后台執行的效果,
#休眠的作用只是讓php先把前面的輸出作完,不要急於馬上執行下面的代碼,休息一下而已,也就是說下面的代碼
#執行的時候前面的輸出應該到達瀏覽器了
sleep(1);
echo '這里的輸出用戶看不到,后台運行的';
//下面代碼的任何輸出都不會輸出給瀏覽器,因為http連接已經關了,
//所以下面的代碼的執行屬於后台運行的
ignore_user_abort(true); // 后台運行,這個只是運行瀏覽器關閉,並不是直接就中止返回200狀態。
set_time_limit(0); // 取消腳本運行時間的超時上限
rundata();
function rundata(){//do something}
代碼如下:
<?php
ignore_user_abort(true);
set_time_limit(0);
while(1) {
$fp = fopen('time_task.txt',"a+");
$str = date("Y-m-d h:i:s")."\n\r";
fwrite($fp,$str);
fclose($fp);
sleep(300); //半小時執行一次
}
?>
這個函數的作用是指示服務器端在遠程客戶端關閉連接后是否繼續執行下面的腳本。
setting 參數是一個可選參數。如設置為True,則表示如果用戶停止腳本運行,仍然不影響腳本的運行(即:腳本將持續執行);如果設置為False,則表示當用戶停止運行腳本程序時,腳本程序將停止運行。
下面這個例子,在用戶關閉瀏覽器后,該腳本仍然后在服務器上繼續執行:
ignore_user_abort(true); // 后台運行
set_time_limit(0); // 取消腳本運行時間的超時上限
do{
sleep(60); // 休眠1分鍾
}while(true);
?>
除非在服務器上關閉這個程序,否則這斷代碼將永遠執行下去。
-------------------------------------------------------------------------
ignore_user_abort(true); // 后台運行
set_time_limit(0); // 取消腳本運行時間的超時上限
echo 'start. ';
sleep(1000);
echo 'end. ';
?>