真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php中怎么使用fsockopen實(shí)現(xiàn)異步請求

php中怎么使用fsockopen實(shí)現(xiàn)異步請求,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)于2013年開始,先為西湖等服務(wù)建站,西湖等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為西湖企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

php執(zhí)行一段程序,有可能幾毫秒就執(zhí)行完畢,也有可能耗時較長。

例如,用戶下單這個事件,如果調(diào)用了些第三方服務(wù)進(jìn)行發(fā)郵件、短信、推送等通知,可能導(dǎo)致前端一直在等待。

而有的時候,我們并不關(guān)心這些耗時腳本的返回結(jié)果,只要執(zhí)行就行了。這時候就需要采用異步的方式執(zhí)行。

眾所周知,PHP沒有直接支持多線程這種東西。我們可以采用折衷的方式實(shí)現(xiàn)。這里主要說的就是fsockopen

通過fsockopen發(fā)送請求并忽略返回結(jié)果,程序可以馬上返回。

示例代碼:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)\n";
} else {
    $out = "GET /backend.php   HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
 
    fwrite($fp, $out);
    /*忽略執(zhí)行結(jié)果
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }*/
    fclose($fp);
}

需要注意的是我們需要手動拼出header頭信息。通過打開注釋部分,可以查看請求返回結(jié)果,但這時候又變成同步的了,因?yàn)槌绦驎却祷亟Y(jié)果才結(jié)束。

實(shí)際測試的時候發(fā)現(xiàn),不忽略執(zhí)行結(jié)果,調(diào)試的時候每次都會成功發(fā)送sock請求;但忽略執(zhí)行結(jié)果,經(jīng)??吹?jīng)]有成功發(fā)送sock請求。查看nginx日志,發(fā)現(xiàn)很多狀態(tài)碼為499的請求。

后來找到了原因:

fwrite之后馬上執(zhí)行fclose,nginx會直接返回499,不會把請求轉(zhuǎn)發(fā)給php處理。

客戶端主動端口請求連接時,NGINX 不會將該請求代理給上游服務(wù)(FastCGI PHP 進(jìn)程),這個時候 access log 中會以 499 記錄這個請求。

解決方案:

1)nginx.conf增加配置

# 忽略客戶端中斷
fastcgi_ignore_client_abort on;

2)fwrite之后使用usleep函數(shù)休眠20毫秒:

usleep(20000);

后來測試就沒有發(fā)現(xiàn)失敗的情況了。

附上完整代碼:

看完上述內(nèi)容,你們掌握php中怎么使用fsockopen實(shí)現(xiàn)異步請求的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


標(biāo)題名稱:php中怎么使用fsockopen實(shí)現(xiàn)異步請求
文章位置:http://weahome.cn/article/jhdgoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部