PHP 異步執(zhí)行方法,模擬多線程的應(yīng)用分析
更新時間:2013年06月03日 15:15:26 作者:
本篇文章是對PHP 異步執(zhí)行方法,模擬多線程的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
PHP 本身沒有多線程的東西,但可以曲線的辦法來造就出同樣的效果,比如多進(jìn)程的方式來達(dá)到異步調(diào)用,只限于命令模式。
另外還有一種更簡單的方式可用于 Web 程序中,那就是用 fsockopen()、fputs() 來請求一個 URL, 而無需等待返回,如果你在那個被請求的頁面(URL)中做些事情就相當(dāng)于異步了。
關(guān)鍵代碼如下:
<?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 發(fā)送完請求就不管了,用不著等待請求頁面的響應(yīng)數(shù)據(jù),利用這一點(diǎn)就可以在被請求的頁面 another_page.php 中異步的做些事情了。
比如,一個很切實(shí)的應(yīng)用,我們每當(dāng)發(fā)表了一篇新日志后需要給所有該日志的訂閱者發(fā)個郵件通知, 如果按照通常的方式就是:
日志寫完 -> 點(diǎn)提交按鈕 -> 日志插入到數(shù)據(jù)庫 -> 發(fā)送郵件通知 -> 告知撰寫者發(fā)布成功
那么作者在點(diǎn)提交按鈕到看到成功提示之間可能會等待很常時間,基本是在等郵件發(fā)送的過程,比如連接郵件服務(wù)異常、或器緩慢或是訂閱者太多。而實(shí)際上是不管郵件發(fā)送成功與否,保證日志保存成功基本可接受的,所以等待郵件發(fā)送的過程是很不經(jīng)濟(jì)的,這個過程可異步來執(zhí)行,并且郵件發(fā)送的結(jié)果不太關(guān)心或以日志形式記錄備查。
改進(jìn)后的流程就是:
日志寫完 -> 點(diǎn)提交按鈕 -> 日志插入到數(shù)據(jù)庫 ---> 告知撰寫者發(fā)布成功
└ 發(fā)送郵件通知 -> [記下日志]
寫個實(shí)際的程序來測試一下,有兩個文件,分別是 write.php 和 sendmail.php,在 sendmail.php 用 sleep(seconds) 來模擬程序執(zhí)行所使用時間。
write.php,執(zhí)行耗時 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,執(zhí)行耗時 10 秒:
<?php
sleep(10);
fopen("C:/" . time(), "w");
通過頁面訪問 write.php,頁面輸出:
1272472697
call asyn_sendmail
1272472698
并且在 C:/ 生成文件:
1272472708
從上面的結(jié)果可以看出 sendmail.php 至少花費(fèi) 10 秒,但不會阻塞 write.php 繼續(xù)往下執(zhí)行,表明這一過程是異步的。
另外還有一種更簡單的方式可用于 Web 程序中,那就是用 fsockopen()、fputs() 來請求一個 URL, 而無需等待返回,如果你在那個被請求的頁面(URL)中做些事情就相當(dāng)于異步了。
關(guān)鍵代碼如下:
復(fù)制代碼 代碼如下:
<?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 發(fā)送完請求就不管了,用不著等待請求頁面的響應(yīng)數(shù)據(jù),利用這一點(diǎn)就可以在被請求的頁面 another_page.php 中異步的做些事情了。
比如,一個很切實(shí)的應(yīng)用,我們每當(dāng)發(fā)表了一篇新日志后需要給所有該日志的訂閱者發(fā)個郵件通知, 如果按照通常的方式就是:
日志寫完 -> 點(diǎn)提交按鈕 -> 日志插入到數(shù)據(jù)庫 -> 發(fā)送郵件通知 -> 告知撰寫者發(fā)布成功
那么作者在點(diǎn)提交按鈕到看到成功提示之間可能會等待很常時間,基本是在等郵件發(fā)送的過程,比如連接郵件服務(wù)異常、或器緩慢或是訂閱者太多。而實(shí)際上是不管郵件發(fā)送成功與否,保證日志保存成功基本可接受的,所以等待郵件發(fā)送的過程是很不經(jīng)濟(jì)的,這個過程可異步來執(zhí)行,并且郵件發(fā)送的結(jié)果不太關(guān)心或以日志形式記錄備查。
改進(jìn)后的流程就是:
日志寫完 -> 點(diǎn)提交按鈕 -> 日志插入到數(shù)據(jù)庫 ---> 告知撰寫者發(fā)布成功
└ 發(fā)送郵件通知 -> [記下日志]
寫個實(shí)際的程序來測試一下,有兩個文件,分別是 write.php 和 sendmail.php,在 sendmail.php 用 sleep(seconds) 來模擬程序執(zhí)行所使用時間。
write.php,執(zhí)行耗時 1 秒:
復(fù)制代碼 代碼如下:
<?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,執(zhí)行耗時 10 秒:
復(fù)制代碼 代碼如下:
<?php
sleep(10);
fopen("C:/" . time(), "w");
通過頁面訪問 write.php,頁面輸出:
1272472697
call asyn_sendmail
1272472698
并且在 C:/ 生成文件:
1272472708
從上面的結(jié)果可以看出 sendmail.php 至少花費(fèi) 10 秒,但不會阻塞 write.php 繼續(xù)往下執(zhí)行,表明這一過程是異步的。
您可能感興趣的文章:
- PHP框架Laravel中實(shí)現(xiàn)supervisor執(zhí)行異步進(jìn)程的方法
- 4種PHP異步執(zhí)行的常用方式
- PHP ajax 異步執(zhí)行不等待執(zhí)行結(jié)果的處理方法
- 基于PHP異步執(zhí)行的常用方式詳解
- 深入PHP異步執(zhí)行的詳解
- 實(shí)現(xiàn)PHP多線程異步請求的3種方法
- PHP curl 抓取AJAX異步內(nèi)容示例
- php異步多線程swoole用法實(shí)例
- 利用ThinkPHP內(nèi)置的ThinkAjax實(shí)現(xiàn)異步傳輸技術(shù)的實(shí)現(xiàn)方法
- PHP的Laravel框架中使用消息隊(duì)列queue及異步隊(duì)列的方法
- PHP編程實(shí)現(xiàn)腳本異步執(zhí)行的方法
相關(guān)文章
yii實(shí)現(xiàn)創(chuàng)建驗(yàn)證碼實(shí)例解析
這篇文章主要介紹了yii實(shí)現(xiàn)創(chuàng)建驗(yàn)證碼的方法,很常見的一類功能,需要的朋友可以參考下2014-07-07php each 返回?cái)?shù)組中當(dāng)前的鍵值對并將數(shù)組指針向前移動一步實(shí)例
php each函數(shù)用于獲取數(shù)組的鍵值對,并將數(shù)組指針向前移動一步, each函數(shù)經(jīng)常和list結(jié)合使用來遍歷數(shù)組。本文章向大家介紹each的基本使用方法,需要的朋友可以參考下2016-11-11thinkphp3.2框架集成QRcode生成二維碼的方法分析
這篇文章主要介紹了thinkphp3.2框架集成QRcode生成二維碼的方法,結(jié)合實(shí)例形式分析了QRcode的下載、擴(kuò)展以及thinkphp3.2使用QRcode生成二維碼的相關(guān)操作技巧,需要的朋友可以參考下2020-03-03codeigniter上傳圖片不能正確識別圖片類型問題解決方法
這篇文章主要介紹了codeigniter上傳圖片不能正確識別圖片類型問題解決方法,這是一個不太常見的問題,但是遇到了的話會卡人很久,需要的朋友可以參考下2014-07-07php使用cookie實(shí)現(xiàn)記住登錄狀態(tài)
這篇文章主要介紹了php使用cookie實(shí)現(xiàn)記住登錄狀態(tài),本文用最原始的方法講解如何實(shí)現(xiàn)記住登錄狀態(tài),給出3個步驟和具體實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04