瀏覽器和服務器之間只一種面向無連接的HTTP協議進行通訊的,面向無連接的程序的特點是客戶端請求服務端,服務端根據請求輸出相應的程序,不能保持持久連接。
這樣就出現了一個問題,一個客戶端的相應服務端可能執行1秒也有可能執行1分鍾,這樣瀏覽器就會一直處於等待狀態,如果程序執行緩慢,用戶可能就沒耐心關掉了瀏覽器。
而有的時候我們不需要關心程序執行的結果,沒有必要這樣浪費時間和耐心等待,那我們就要想出辦法讓程序不收等待在后台靜默執行。
根據個人的總結,總結了如下方法:
1.客戶端頁面采用AJAX技術請求服務器
大多用於提升用戶的體驗而弄。
2 利用linux多進程與php函數相結合
利用php的popen函數打開進程文件指針,配合linux命令,打開的多進程趨於穩定。
$cmd = "cd /dir/代碼目錄;php index.php method >> ".$log_file." &";
// linux命令 ,建議把執行結果輸出於日志
for($i = 1; $i <= $thisPlantaskConfig['thread']; $i++) //用參數thread控制開啟的進程數
{
pclose(popen($cmd, "w")); //打開進程
usleep(mt_rand(100,500)); //間隔打開
}
這樣子開啟的多進程模式會存在某些缺陷,在后期的文章中會提及
3 遠程請求的多進程
curl的多線程操作,創建批處理句柄,發出多請求,不用等待上個請求是否成功
<?php // 創建一對cURL資源 $ch1 = curl_init(); $ch2 = curl_init(); // 設置URL和相應的選項 curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); // 創建批處理cURL句柄 $mh = curl_multi_init(); // 增加2個句柄 curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; // 執行批處理句柄 do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // 關閉全部句柄 curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); ?>
4 使用某些擴展
利用某些通信擴展,例如php-process
當然,我個人不建議使用這個。
5 利用開源項目
善於利用前輩的經驗,站在巨人的肩膀上。
swoole 和 workerman 是我個人認為非常過優秀的異步,並行,高性能的網絡通信框架,值得學習