客戶端與服務端通過 HTTP 通訊,服務端處理耗時操作時,客戶端需同步等待。為避免阻塞,需異步執行:服務端快速響應前端,耗時任務放入後台靜默執行。
原理:HTML 中插入 AJAX 或 <img src="doRequest.php">。
優點:實現簡單,服務端無調用。
缺點:瀏覽器長時間 loading,非真正異步。
$.get("doRequest.php", {name: "fdipzone"});
<img src="doRequest.php?name=fdipzone">
語法:resource popen(string $command, string $mode)
示例:pclose(popen('php /home/fdipzone/doRequest.php &', 'r'));
優點:執行速度快。
缺點:僅限本機;難傳大量參數;高併發產生大量進程。
設置 CURLOPT_TIMEOUT = 1(最小 1 秒):
$ch = curl_init();
$curl_opt = [
CURLOPT_URL => 'https://www.example.com/doRequest.php',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 1,
];
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
手動構造 POST 請求,最靈活:
function doRequest($url, $param = []) {
$urlinfo = parse_url($url);
$host = $urlinfo['host'];
$path = $urlinfo['path'];
$query = $param ? http_build_query($param) : '';
$fp = fsockopen($host, 80, $errno, $errstr, 10);
$out = "POST $path HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Content-Length: " . strlen($query) . "\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= $query;
fputs($fp, $out);
fclose($fp);
}
在被調用腳本開頭加入:
ignore_user_abort(true); // 忽略客戶端斷開 set_time_limit(0); // 取消執行超時限制