国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP 異步執(zhí)行方法,模擬多線程的應用分析

2020-03-22 20:09:08
字體:
來源:轉載
供稿:網(wǎng)友
PHP 本身沒有多線程的東西,但可以曲線的辦法來造就出同樣的效果,比如多進程的方式來達到異步調用,只限于命令模式。
另外還有一種更簡單的方式可用于 Web 程序中,那就是用 fsockopen()、fputs() 來請求一個 URL, 而無需等待返回,如果你在那個被請求的頁面(URL)中做些事情就相當于異步了。
關鍵代碼如下:
復制代碼 代碼如下:
?php
$fp = fsockopen('localhost',80,&$errno,&$errstr,5);
if(!$fp)
{
echo "$errstr ($errno) br /
}
fputs($fp,"GET another_page.php?flag=1/r/n");
fclose($fp);

上面的代碼向頁面 another_page.php 發(fā)送完請求就不管了,用不著等待請求頁面的響應數(shù)據(jù),利用這一點就可以在被請求的頁面 another_page.php 中異步的做些事情了。
比如,一個很切實的應用,我們每當發(fā)表了一篇新日志后需要給所有該日志的訂閱者發(fā)個郵件通知, 如果按照通常的方式就是:
日志寫完 - 點提交按鈕 - 日志插入到數(shù)據(jù)庫 - 發(fā)送郵件通知 - 告知撰寫者發(fā)布成功
那么作者在點提交按鈕到看到成功提示之間可能會等待很常時間,基本是在等郵件發(fā)送的過程,比如連接郵件服務異常、或器緩慢或是訂閱者太多。而實際上是不管郵件發(fā)送成功與否,保證日志保存成功基本可接受的,所以等待郵件發(fā)送的過程是很不經(jīng)濟的,這個過程可異步來執(zhí)行,并且郵件發(fā)送的結果不太關心或以日志形式記錄備查。
改進后的流程就是:
日志寫完 - 點提交按鈕 - 日志插入到數(shù)據(jù)庫 --- 告知撰寫者發(fā)布成功
└ 發(fā)送郵件通知 - [記下日志]
寫個實際的程序來測試一下,有兩個文件,分別是 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 /
}
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
從上面的結果可以看出 sendmail.php 至少花費 10 秒,但不會阻塞 write.php 繼續(xù)往下執(zhí)行,表明這一過程是異步的。
PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 白玉县| 双桥区| 营山县| 锡林浩特市| 丰镇市| 文山县| 余干县| 常德市| 田东县| 永德县| 商丘市| 南漳县| 德安县| 庆安县| 安新县| 竹山县| 珲春市| 永春县| 元朗区| 夹江县| 多伦县| 上饶市| 镇安县| 周宁县| 贵定县| 绥中县| 南充市| 威远县| 涪陵区| 武鸣县| 陕西省| 同仁县| 沧州市| 永吉县| 收藏| 达尔| 金乡县| 银川市| 封丘县| 乌什县| 射阳县|