轉(zhuǎn)自https://www.awaimai.com/660.html
為讓 PHP 在后端處理長時間任務(wù)時不阻塞奶躯,快速響應(yīng)頁面請求,可以有如下措施:
1 使用 fastcgi_finish_request()
如果 PHP 與 Web 服務(wù)器使用了PHP-FPM(FastCGI 進程管理器),那通過fastcgi_finish_request()函數(shù)能馬上結(jié)束會話,而 PHP 線程可以繼續(xù)在后臺運行。
echo "program start...";
file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND);
fastcgi_finish_request();sleep(1);
echo 'debug...';file_put_contents('log.txt', 'start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND);
sleep(10);
file_put_contents('log.txt', 'end-time:'.date('Y-m-d H:i:s'), FILE_APPEND);
2 使用 fsockopen()
使用fsockopen()打開一個網(wǎng)絡(luò)連接或者一個Unix套接字連接檬嘀,再用stream_set_blocking()非阻塞模式請求:
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) { die('error fsockopen');}// 轉(zhuǎn)換到非阻塞模式
stream_set_blocking($fp, 0);
$http = "GET /save.php? / HTTP/1.1\r\n";
$http .= "Host: www.example.com\r\n";
$http .= "Connection: Close\r\n\r\n";fwrite($fp, $http);fclose($fp);
3 使用 cURL
利用cURL中的curl_multi_*函數(shù)發(fā)送異步請求
$time = time(); // 創(chuàng)建一對cURL資源
$ch1 = curl_init();
$ch2 = curl_init();
$ch3 = curl_init();// 設(shè)置URL和相應(yīng)的選項
curl_setopt($ch1, CURLOPT_URL, "http://test.xtgxiso.cn/sleep1.php");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://test.xtgxiso.cn/sleep2.php");
curl_setopt($ch2, CURLOPT_HEADER, 0);
curl_setopt($ch3, CURLOPT_URL, "http://test.xtgxiso.cn/sleep3.php");
curl_setopt($ch3, CURLOPT_HEADER, 0); // 創(chuàng)建批處理cURL句柄
$mh = curl_multi_init(); // 增加2個句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
curl_multi_add_handle($mh,$ch3);
$running=null; // 執(zhí)行批處理句柄
do { usleep(10000); curl_multi_exec($mh,$running); } while ($running > 0); // 關(guān)閉全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_remove_handle($mh, $ch3);
curl_multi_close($mh);
echo "\n total time : ".(time()-$time)."\n";
5 使用緩存和隊列
使用redis等緩存、隊列责嚷,將數(shù)據(jù)寫入緩存鸳兽,使用后臺計劃任務(wù)實現(xiàn)數(shù)據(jù)異步處理。
6 調(diào)用系統(tǒng)命令
極端的情況下再层,可以調(diào)用系統(tǒng)命令贸铜,可以將數(shù)據(jù)傳給后臺任務(wù)執(zhí)行