PHP 先返回結果到前端,PHP代碼繼續執行後續的任務

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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章