目前的場(chǎng)景,服務(wù)端開啟一個(gè)http服務(wù),服務(wù)端向客戶端以SSE(Server-sent Events)方式發(fā)送數(shù)據(jù),當(dāng)客戶端主動(dòng)斷開連接,服務(wù)端的數(shù)據(jù)還在持續(xù)發(fā)送,這時(shí)候同一個(gè)客戶端再次連接會(huì)連接不上,觀察發(fā)現(xiàn)只有SSE發(fā)送完成之后才會(huì)觸發(fā)onClose、同一個(gè)客戶端才能再次建立連接。
我現(xiàn)在需要的時(shí)當(dāng)同一個(gè)客戶端主動(dòng)斷開連接后,服務(wù)端允許同一個(gè)客戶端馬上重新建立連接且不影響之前連接的數(shù)據(jù)處理,請(qǐng)問有什么好的方法呢?
發(fā)重現(xiàn)問題的代碼,包括客戶端和服務(wù)端,要精簡(jiǎn)的可運(yùn)行代碼
服務(wù)端http進(jìn)程采用的是文檔里自定義進(jìn)程的邏輯( http://m.wtbis.cn/doc/webman/process.html ),調(diào)用$connection->send()向客戶端發(fā)送數(shù)據(jù)。
發(fā)現(xiàn)config/process.php里count=1時(shí),同一個(gè)客戶端主動(dòng)斷開幾秒然后再次連接時(shí),因上一個(gè)連接的sse響應(yīng)還未結(jié)束,所以一直處于連接中狀態(tài),等上一個(gè)連接的程序跑完了,舊連接上了;
現(xiàn)在count>1時(shí),倒是不會(huì)出現(xiàn)這種情況,算是暫時(shí)解決了。
目前數(shù)據(jù)量不大(產(chǎn)品還在測(cè)試階段),也沒有死循環(huán),沒用sleep。
倒是有一個(gè)遞歸調(diào)用外部接口的邏輯,但也加了遞歸次數(shù)限制,不會(huì)陷入死循環(huán)。
通過觀察發(fā)現(xiàn),客戶端斷開連接之后,sse的輸出(打字機(jī)效果)結(jié)束之后才會(huì)調(diào)用onClose
那就是進(jìn)程一直在運(yùn)行遞歸調(diào)用接口邏輯,workerman內(nèi)核無法得到運(yùn)行權(quán),沒辦法響應(yīng)新的連接事件