[小技巧]導檔案超出php或nginx超時時間,怎們辦?

咖啡色的羊駝發表於2016-03-21

場景:匯出檔案的時候,會出現一種情況,由於資料量太大而要去資料,組織資料等耗費比較長的時間,遠超php或nginx設定的超時時間的時候怎麼破?


解決辦法:將檔案操作防禦後臺指令碼處理去執行,過幾分鐘再進行下載並且刪除暫存的檔案即可.


虛擬碼的實現:

$file = TEMP_DIR.'/'.$filename;
$cmd = 'php '.ROOT_PATH.'/cron/xxx.php';
if (!file_exists($file)) {
    //判斷是否已經在後臺執行
    $count = exec('/bin/ps xaww | grep -v grep | grep "'. $cmd . '" |wc -l');
    if (intval($count) == 0) {
        //先檢查有無資料
        ...
        if (xxx) {
        //退出操作
    }
    //非同步執行
    exec("{$cmd} {arguments}> /dev/null &");
    }
    echo '請10分鐘後再重新整理此頁面';
    exit;
} else {
    //輸出檔案
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$filename);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    unlink($file);
    exit;
}

//ps:指令碼中可以用$argv接收引數

還有一種相對效率更高的形式是:通過swoole任務去執行,也可以減少指令碼數量,提高程式碼維護成本

相關文章