swoole+webSocket? 消息推送,或則聊天室,實現(xiàn)。
先上代碼,(上菜。。。。)點對點,簡單(客戶發(fā)送,服務回復。)
點對所有,廣播
見圖所示:參數(shù)詳解
/** * 1.實例化? 對象 * $host? 127.0.0.1 (本機)? 外網(wǎng):0.0.0.0 (ipv4的所有可訪問) * $port? 9501 (1024以下 需要root權限) * $mode? 運行模式? ? 1.SWOOLE_PROCESS? 多進程模式(默認)? 2.SWOOLE_BASE? 基本模式? ? (可選) * $sock_type 指定Socket的類型,支持TCP、UDP、TCP6、UDP6、UnixSocket Stream/Dgram 6種? (可選) */// 注:【on 】和jquery類似
采用匿名函數(shù)? $ws ,$fd? 兩個形參? :$ws對象? ? $fd? 客戶端標識符(用戶id)
著重 注意:$fd,這是基于TCP的客戶端的唯一標識。在swoole官方文檔中,韓老大已經(jīng)寫的很清楚了,
這個$fd,
1.自增的
2.有限(max:1600萬)
3.可復用(但同一個server中,不會重復)
(番外魚:有的人認為,有最大值,且可復用,這樣會限制服務。并且崇洋媚外,殊不知Linux最大支持連接數(shù)是64K,幾位65536,如果自己基于swoole寫的服務,真的達到了同時在線人數(shù)1600w+,并且單服務器。那么,什么話都別說,膜拜)
思考:服務怎么和實際業(yè)務完美的結合,綁定,映射實現(xiàn)。
途徑:DB,redis,memcache,apc,等等。
1.當客戶端發(fā)來請求,并攜帶uid,或用戶名等(業(yè)務中的唯一標識)
2.建立連接時,存入? ? ? ? ? ? ? 綁定,產(chǎn)生映射關系。? ?$fd1 ==? ?uid10086? ? ? ? ?$fd2 ==? ?uid10010
3.業(yè)務處理,點對點發(fā)送,客戶端傳來。想要發(fā)送給B,B的uid,同時uid_B發(fā)來??,此時查找當前的uid_B的映射$fd,然后發(fā)送。
? ? ? ? ? ? ? ? ? ? 點對多,同樣,從映射中獲取,并遍歷,$server->push($fd,“我是誰誰,我想告訴你們”);
4.何時取消映射關系?何時取消可以保證復用的時候,關系沒有錯亂?
當然是在關閉的時候取消當前的映射關系,以防止在復用的時候導致關系的錯亂。
以上僅為大概思路,具體操作當中,還要考慮到心跳檢測,以防止客戶端斷電,等意外因素。
心跳檢測的思路:
方法1.客戶端在固定的時間間隔中發(fā)送請求,后臺服務判斷,某個$fd,在超出時間間隔范圍外,仍沒有給我匯報,則宣布死亡
方法2.服務端主動打發(fā)送信息,客戶端可返回信息,可不返回信息。
? ? ? ? ?A,客戶端返回信息,此時后端接收到信息,知道該連接還活著。
? ? ? ? ?B,傲嬌的客戶端不返回信息,后端仍然孜孜不倦的發(fā)送,直到客戶端已經(jīng)關閉,此時服務端發(fā)送的消息會在tcp層,因為發(fā)送超時,而關閉。
php的發(fā)展,在突破自身瓶頸之后,不在是web小王子,而是可以百變金剛。phper在不止步于業(yè)務層面上更進一步,相反,phper能實現(xiàn)更多的業(yè)務需求。
我為人人,人人為我;美美與共,天下大同;