瀏覽器和伺服器之間只有一種面向無連線的http協議進行通訊的,面向無連線的程式的特點是客戶端請求服務端,服務端根據請求返回相應的程式,不能保持持久連線。這樣就出現了乙個問題,乙個客戶端的相應服務端可能執行1秒也有可能執行1分鐘,這樣瀏覽器就會一直處於等待狀態,如果程式執行緩慢,使用者可能就沒耐心關掉了瀏覽器。
而有的時候我們不需要關心程式執行的結果,沒有必要這樣浪費時間和耐心等待,那我們就要想出辦法讓程式不收等待在後台靜默執行。比如現在有乙個場景,給1000個使用者傳送一封推薦郵件,使用者輸入或者匯入郵件賬號了提交伺服器執行傳送。
$count = count($emailarr);
for($i =0; $i < $count; $i++)
sendmail();//傳送郵件
這段**使用者體驗極差,也無法實際運用,首先傳送這麼多郵件會產生伺服器執行超時,其實漫長的使用者等待時間會讓使用者對系統產品懷疑和失去信心。但是使用者不需要等待到1000封郵件都傳送完畢了才提交傳送成功,我們完全可以提交後台後直接給使用者提示傳送成功,然後讓後台程式靜默依次傳送。
這個時候我們就需要「非同步執行」技術來執行**,非同步執行的特點是後台靜默執行,使用者無需等待**的執行結果,使用非同步執行的好處:
擺脫了應用程式對單個任務的依賴性
提高了程式的執行效率
提高了程式的擴充套件性
在一定場景提高了使用者體驗
因為php不支援多執行緒,使用非同步呼叫的請求多個http的方式達到了程式並行執行效果,但是注意的是請求的http過多的話,會大大加大了系統的開銷。
php非同步執行的常用方式
1. 客戶端頁面採用ajax技術請求伺服器
最簡單的辦法就是在返回給客戶端的html**中,嵌入ajax呼叫,或者,嵌入乙個img標籤,src指向要執行的耗時指令碼。這種方法最簡單,也最快。伺服器端不用做任何的呼叫。
但是缺點是,一般來說ajax都應該在onload以後觸發,也就是說,使用者點開頁面後,就關閉,那就不會觸發我們的後台指令碼了。
而使用img標籤的話,這種方式不能稱為嚴格意義上的非同步執行。使用者瀏覽器會長時間等待php指令碼的執行完成,也就是使用者瀏覽器的狀態列一直顯示還在load。當然,還可以使用其他的類似原理的方法,比如script標籤等等。
2. popen()函式
resource popen ( string command, string mode );
開啟乙個指向程序的管道,該程序由派生給定的 command 命令執行而產生。開啟乙個指向程序的管道,該程序由派生給定的 command 命令執行而產生。
所以可以通過呼叫它,但忽略它的輸出。
pclose(popen("/home/xinchen/backend.php &", 'r'));
這個方法避免了第乙個方法的缺點,並且也很快。但是問題是,這種方法不能通過http協議請求另外的乙個webservice,只能執行本地的指令碼檔案。並且只能單向開啟,無法穿大量引數給被呼叫指令碼。並且如果,訪問量很高的時候,會產生大量的程序。如果使用到了外部資源,還要自己考慮競爭。
3. curl擴充套件
curl是乙個強大的http命令列工具,可以模擬post/get等http請求,然後得到和提取資料,顯示在"標準輸出"(stdout)上面。
$ch = curl_init();
$curl_opt = array(curlopt_url, '',
curlopt_returntransfer, 1,
curlopt_timeout, 1,);
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);
使用curl需要設定curopt_timeout為1(最小為1,鬱悶)。也就是說,客戶端至少必須等待1秒鐘。
4. fscokopen()函式
fsockopen是乙個非常強大的函式,支援socket程式設計,可以使用fsockopen實現郵件傳送等socket程式等等,使用fcockopen需要自己手動拼接出header部分。官方文件:
/*忽略執行結果
while (!feof($fp)) {
echo fgets($fp, 128);
fclose($fp);
php 非同步執行
header host url array host r n http 1.1 host域不能省略 header connection close r n r n header connection close r n r n if empty post data out connection cl...
php非同步處理
namespace index controller usecore controller class test extends controller public function test12 php非同步請求 param host string 主機位址 param path string 路...
php處理非同步請求 PHP非同步請求實現方式
一.使用fsockopen的方式 我們建立了乙個基於fsockopen的函式,這個函式中利用fsockopen去訪問url,但是在訪問時,並不要求獲取url顯示的內容,而是僅僅發出訪問請求,請求到達後馬上關閉這個訪問.使用fsocketopen 方式傳送非同步請求,put方式 stream set ...