phpsocket.io 寫了一個(gè)服務(wù)端 監(jiān)聽了幾個(gè)事件
事件都是查詢數(shù)據(jù)庫(kù) 數(shù)據(jù)不打
web端定時(shí)請(qǐng)求
幾十個(gè)人訪問就卡住了
lievent和 內(nèi)核都跳優(yōu)了
難道他這種單進(jìn)程,不能做耗時(shí)操作
可以 strace -p 進(jìn)程pid 看下進(jìn)程在干什么。
單進(jìn)程不適合做耗時(shí)操作,比如一個(gè)請(qǐng)求查數(shù)據(jù)庫(kù)耗時(shí)1秒,那么其它請(qǐng)求就會(huì)被阻塞等待,也就是這個(gè)進(jìn)程每秒只能處理一個(gè)請(qǐng)求。幾十個(gè)請(qǐng)求一同發(fā)過來,進(jìn)程要卡幾十秒。假設(shè)說每個(gè)查詢請(qǐng)求0.1秒就完成,那幾十個(gè)客戶端一起發(fā)來請(qǐng)求,進(jìn)程也要幾秒才能處理完,也會(huì)后卡住的現(xiàn)象。
解決辦法:
耗時(shí)的操作可以直接post給tp等mvc框架做,需要推送消息給客戶端的時(shí)候利用phpsocket.io推送。
推送可以參考web-msg-sender的做法,利用curl與phpsocket.io通訊,讓phpsocket.io推送數(shù)據(jù)。
這樣phpsocket.io里沒有任何阻塞的邏輯,linux內(nèi)核優(yōu)化好,libevent/event擴(kuò)展裝好,單進(jìn)程上萬個(gè)客戶端都可以應(yīng)付。