PHP中,在客戶端發出請求觸發腳本執行,然後在服務器端執行一段代碼,頁面關閉了也要繼續執行,並且要先返回一些狀態給客戶端,避免前端等待超時。
/**************** 1 返回給前端結果之前的操作 ****************/
/**************** 2 告訴前端結果,告訴瀏覽器操作成功,但繼續運行php ****************/
ob_end_clean();
ob_start();
//Windows服務器需要加上這行。
echo str_repeat(" ",4096);//windows
// echo str_repeat(' ', 65536); //linux
//-----------------------------------------------------------------------------------
_ajaxReturntwo(200,'操作成功');//返回結果給ajax
//-----------------------------------------------------------------------------------
$size = ob_get_length();
header("Content-Length: ".$size);
header("Connection: close");
header("HTTP/1.1 200 OK");
header('Content-Type:application/json; charset=utf-8');
ob_end_flush();
if(ob_get_length())
ob_flush();
flush();
if (function_exists("fastcgi_finish_request")) { // yii或yaf默認不會立即輸出,加上此句即可(前提是用的fpm)
fastcgi_finish_request(); // 響應完成, 立即返回到前端,關閉連接
}
ignore_user_abort(true);//在關閉連接後,繼續運行php腳本
set_time_limit(0); //no time limit,不設置超時時間(根據實際情況使用)
/**************** 2 告訴前端結果,告訴瀏覽器完成,但繼續運行php ****************/
/**************** 3 繼續運行php ****************/
sleep(20);
/*
休眠PHP,也就是當前PHP代碼的執行停止,20秒鐘後PHP被喚醒,
PHP喚醒後,繼續執行下面的代碼,但這個時候上面代碼的結果已經輸出瀏覽器了,
也就是瀏覽器從HTTP頭中知道了服務端關閉了連接,瀏覽器將不在等待服務器的響應,
反應給客戶的就是頁面不會顯示處於加載狀態,換句話說用戶可以關掉當前頁面,或者關掉瀏覽器,
PHP喚醒後繼續執行下面的代碼,這也就實現了PHP後臺執行的效果,
休眠的作用只是讓php先把前面的輸出作完,不要急於馬上執行下面的代碼,休息一下而已,也就是說下面的代碼
執行的時候前面的輸出應該到達瀏覽器了
*/
.......繼續寫功能的邏輯
function _ajaxReturntwo($code, $msg, $data=array())
{
$data = is_null($data) ? array() : $data;
$data = array(
"code" => $code,
"msg" => $msg,
"data" => json_encode($data)
);
header('Cache-Control:no-cache,must-revalidate');
header('Pragma:no-cache');
header('Content-Type:application/json; charset=utf-8');
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers:x-requested-with,content-type");
echo json_encode($data);
}