溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP異步非阻塞之路

發(fā)布時(shí)間:2020-02-25 05:56:55 來(lái)源:網(wǎng)絡(luò) 閱讀:757 作者:盧卡斯CN 欄目:web開(kāi)發(fā)

需求

一個(gè)簡(jiǎn)單的需求,提交大量數(shù)據(jù)到遠(yuǎn)程服務(wù)器,此時(shí)并不需要等待返回。
另一個(gè)需求,獲取API數(shù)據(jù),同時(shí)查詢數(shù)據(jù)庫(kù),并行處理,加快響應(yīng)速度。

配置問(wèn)題

set_time_limit
ignore_user_abort

fastcgi_finish_request

只是結(jié)束會(huì)話后繼續(xù)執(zhí)行,并沒(méi)有并發(fā),勉強(qiáng)非阻塞

curl

無(wú)法非阻塞,只能等待,可以并發(fā)
https://github.com/guzzle/guzzle/issues/1127

fsockopen

坑最多的地方
首先,fwrite并不都是成功的,返回寫(xiě)入的字節(jié)數(shù),并不是全部
其次,PHP的bug,stream_set_blocking設(shè)置非阻塞,須等待才能寫(xiě)入,7.0.x以上才解決,https://github.com/php/php-src/pull/2330

Warning: fwrite(): SSL operation failed with code 1. OpenSSL Error messages: error: 1409F07F: SSL routines: SSL3_WRITE_PENDING: bad write retry

再次,Keep-Alive的坑,需要比對(duì)Content-Length和返回長(zhǎng)度,然后斷開(kāi)
最后,Transfer-Coding的值如果為Chunked,需要拼接返回結(jié)果
pfsockopen,需要使用Keep-Alive,并且不能close鏈接

其他

異步框架:swoole。。。
計(jì)劃任務(wù):redis+crond
pcntl:開(kāi)啟新進(jìn)程
popen:調(diào)用外部程序

最終還是使用了popen開(kāi)啟新進(jìn)程

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI