瀏覽器和服務器之間只一種面向無鏈接的HTTP協議進行通信的,面向無鏈接的程序的特色是客戶端請求服務端,服務端根據請求輸出相應的程序,不能保持持久鏈接。php
這樣就出現了一個問題,一個客戶端的相應服務端可能執行1秒也有可能執行1分鐘,這樣瀏覽器就會一直處於等待狀態,若是程序執行緩慢,用戶可能就沒耐心關掉了瀏覽器。linux
而有的時候咱們不須要關心程序執行的結果,沒有必要這樣浪費時間和耐心等待,那咱們就要想出辦法讓程序不收等待在後臺靜默執行。瀏覽器
根據我的的總結,總結了以下方法:服務器
1.客戶端頁面採用AJAX技術請求服務器swoole
大多用於提高用戶的體驗而弄。網絡
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)); //間隔打開
} curl
這樣子開啓的多進程模式會存在某些缺陷,在後期的文章中會說起異步
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 是我我的認爲很是過優秀的異步,並行,高性能的網絡通訊框架,值得學習