php中怎麼實現後臺執行?先返回用戶請求,然後在後臺運行。

個人博客地址:http://www.lampnick.com/php/364
<?php
ignore_user_abort(true); // 後臺運行,不受前端斷開連接影響
set_time_limit(3600); // 腳本最多運行1個小時
//後臺運行的後面還要,set_time_limit(0); 除非在服務器上關閉這個程序,否則下面的代碼將永遠執行下去止到完成爲止。
//如果程序運行不超時,在沒有執行結束前,程序不會自動結束的.
//=========================================
//PHP中,在客戶端發出請求觸發腳本執行,然後在服務器端執行一段代碼,頁面關閉了也要繼續執行,並且要先返回一些狀態給客戶端,避免前端等待超時。

ob_end_clean();//清除之前的緩衝內容,這是必需的,如果之前的緩存不爲空的話,裏面可能有http頭或者其它內容,導致後面的內容不能及時的輸出
header("Connection: close");//告訴瀏覽器,連接關閉了,這樣瀏覽器就不用等待服務器的響應
header("HTTP/1.1 200 OK"); //可以發送200狀態碼,以這些請求是成功的,要不然可能瀏覽器會重試,特別是有代理的情況下

//return false;//加了這個下面的就不執行了,不加這個無法返回頁面狀態,瀏覽器一直在等待狀態,可以關閉,但不是要的效果。
//die(); 或 return ;也一樣不執行下面的
//runRack();自定義函數
//register_shutdown_function("runRack");
//return  ;

ob_start();//開始當前代碼緩衝
$arr = ["文件生成中"];
echo json_encode($arr);
//下面輸出http的一些頭信息
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();//輸出當前緩衝
flush();//輸出PHP緩衝
//在Yii2框架下,上面代碼可能不會立即返回給客戶端,所以需要加如下的代碼,即可實現立即返回給客戶端
//具體可查看此文章:http://www.lampnick.com/php/375
if (function_exists("fastcgi_finish_request")) {
     fastcgi_finish_request(); /* 響應完成, 關閉連接 */
} 
/*
  休眠PHP,也就是當前PHP代碼的執行停止,20秒鐘後PHP被喚醒,
  PHP喚醒後,繼續執行下面的代碼,但這個時候上面代碼的結果已經輸出瀏覽器了,
  也就是瀏覽器從HTTP頭中知道了服務端關閉了連接,瀏覽器將不在等待服務器的響應,
  反應給客戶的就是頁面不會顯示處於加載狀態,換句話說用戶可以關掉當前頁面,或者關掉瀏覽器,
  PHP喚醒後繼續執行下面的代碼,這也就實現了PHP後臺執行的效果,
  休眠的作用只是讓php先把前面的輸出作完,不要急於馬上執行下面的代碼,休息一下而已,也就是說下面的代碼
  執行的時候前面的輸出應該到達瀏覽器了
*/
sleep(20);
echo '這裏的輸出用戶看不到,後臺運行的';

//下面代碼的任何輸出都不會輸出給瀏覽器,因爲http連接已經關了,
//所以下面的代碼的執行屬於後臺運行的

ignore_user_abort(true); // 後臺運行,這個只是運行瀏覽器關閉,並不是直接就中止返回200狀態。
set_time_limit(3600); // 腳本最多運行1個小時

runRack();

function runRack()
{
    file_put_contents("c:/runBack.txt", "後臺運行輸出結果");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章