HTTP 協議無連接特性導致客戶端需等待服務端處理完成。若任務耗時較長(如發送 1000 封郵件),用戶體驗極差,甚至導致超時。異步執行可讓後台靜默運行,用戶無需等待結果,優勢包括:
在返回的 HTML 中嵌入 AJAX 或 <img src="backend.php">。最簡單,服務端無需調用。缺點:AJAX 需 onLoad 後觸發,用戶關頁面則不執行;img 標籤會導致瀏覽器長時間 loading,非真正異步。
pclose(popen("/home/xinchen/backend.php &", 'r'));
優點:速度快,避免 AJAX 缺點。缺點:只能執行本地腳本,無法請求遠程 WebService;單向管道,難傳大量參數;高併發產生大量進程,需自行處理資源競爭。
設置 CURLOPT_TIMEOUT = 1(最小 1 秒),客戶端至少等待 1 秒:
$ch = curl_init();
$curl_opt = [
CURLOPT_URL => 'https://www.example.com/backend.php',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 1,
];
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
手動拼接 HTTP Header,支援 Socket 編程:
$fp = fsockopen('www.example.com', 80, $errno, $errstr, 30);
if ($fp) {
$out = "GET /backend.php HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
fclose($fp);
}
優點:最靈活,無額外依賴。缺點:需手動構造 Header,代碼較繁瑣。
在被異步調用的腳本開頭加入:
ignore_user_abort(true); // 忽略客戶端斷開 set_time_limit(0); // 取消執行時間限制
確保後台任務不因前端斷開或超時而中斷。