PHP提前響應客戶端,實現異步任務(耗時任務)

當PHP運行在FastCGI模式時,如果有些處理可以在頁面生成完後再進行,就可以使用這個方法.

客戶端響應提前結束,但與此同時服務端腳本卻繼續運行,很適合http協議的異步任務或耗時任務!

下面是封裝的方法,需要的時候執行daemonTask()函數, 參數可選字符串響應:

// 查詢webserver
function queryWebServer()
{
    $sapi = PHP_SAPI;
    $val = null;
    switch ($sapi) {
        case 'fpm-fcgi':
            $val = 'nginx';
            break;
        case 'cgi-fcgi':
            $val = 'nginx';
            break;
        case 'apache2handler':
            $val = 'apache';
            break;
        case 'cli':
            $val = 'cli';
            break;
        default:
            $val = $sapi;
            break;
    }
    return $val;
}

// 耗時任務執行
function daemonTask($str = 'wait!')
{
    ini_set("max_execution_time", "0");
    $webServer = queryWebServer();
    if ($webServer == 'nginx') {
        echo $str;
        fastcgi_finish_request();
    } else if ($webServer == 'apache') {
        ob_end_flush();
        ob_start();
        echo $str;

        header("Content-Type: text/html;charset=utf-8");
        header("Connection: close");
        header('Content-Length: ' . ob_get_length());

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