php 自己沒有多線程的東西,但可以曲線的辦法來造就出同樣的效果,比如多進程的體例來達到異步調用,只限于飭令模式。
另外還有一種更簡單的體例可用于 web 程序中,那就是用 fsockopen()、fputs() 來請求一個 url, 而無需等待返回,假如你在那個被請求的頁面(url)中做些事情就相當于異步了。
關鍵代碼如下:
<?php$fp=fsockopen('localhost',80,&$errno,&$errstr,5);if(!$fp){ echo $errstr ($errno)<br />/n; }fputs($fp,get another_page.php?flag=1/r/n); fclose($fp);上面的代碼向頁面 another_page.php 發送完請求就不管了四川做網站報名,用不著等待請求頁面的響應數據,行使這一點就可以在被請求的頁面 another_page.php 中異步的做些事情了。
比如,一個很切實的應用,我們每當發表了一篇新日志后需要給所有該日志的訂閱者發個郵件通知, 假如按照通常的體例就是:
日志寫完 -> 點提交按鈕 -> 日志插入到數據庫 -> 發送郵件通知 -> 告知撰寫者發布成功
那么作者在點提交按鈕到看到成功提醒之間可能會等待很常時間,基本是在等郵件發送的過程,比如連接郵件服務異常、或器緩慢或是訂閱者太多。而現實上是不管郵件發送成功與否,保證日志保存成功基本可接受的,所以等待郵件發送的過程是很不經濟的,這個過程可異步來執行,并且郵件發送的效果不太關心或以日志形式記錄備查。
改進后的流程就是:
日志寫完 -> 點提交按鈕 -> 日志插入到數據庫 ---> 告知撰寫者發布成功 ---> 發送郵件通知 -> [記下日志]
寫個現實的程序來測試一下上海做網站中心app應用,有兩個文件,分別是 write.php 和 sendmail.php,在 sendmail.php 用 sleep(seconds) 來模擬程序執行所使用時間。
write.php,執行耗時 1 秒:
<?php function asyn_sendmail(){ $fp=fsockopen('localhost',80,&$errno,&$errstr,5); if(!$fp){ echo $errstr ($errno)<br />/n; } sleep(1); fputs($fp,get /sendmail.php?param=1/r/n); #請求的資源 url 一定要寫對 fclose($fp); } echo time().'<br>'; echo 'call asyn_sendmail<br>'; asyn_sendmail(); echo time().'<br>'; sendmail.php,執行耗時 10 秒:
<?php sleep(10); fopen(c:/.time(),w);通過頁面訪問 write.php,頁面輸出:
1272472697
call asyn_sendmail
1272472698
并且在 c:/ 生成文件:
1272472708
從上面的效果可以看出 sendmail.php 至少花費 10 秒,但不會壅塞 write.php 繼續往下執行,注解這一過程是異步的。
您可能感愛好的文章
php異步調試和線上調試網站程序的方法javascript 異步加載,提高網頁的瀏覽速度php curl批量多線程打開網址的類php判斷服務器ssl是否啟用,也就是判斷是否支撐https連接php 行使 curl functions 實現多線程抓取網頁和下載文件php獲取目錄所有文件并將效果保存到數組的程序php行使curl實現多線程的類,php curl多線程下載圖片php行使curl_multi實現多線程
重慶到文昌物流專線炒域名還有“錢”途嗎?如何成功運作事件營銷?泉州到駐馬店物流專線廣州到東陽物流專線金華到慈溪物流專線成都到鶴壁物流專線廣州到樂平物流專線