swoole+webSocket? 消息推送辕近,或則聊天室韵吨,實現。
先上代碼亏推,(上菜学赛。。吞杭。盏浇。)點對點,簡單(客戶發(fā)送芽狗,服務回復绢掰。)
點對所有,廣播
見圖所示:參數詳解
/** * 1.實例化? 對象 * $host? 127.0.0.1 (本機)? 外網: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類似
采用匿名函數? $ws ,$fd? 兩個形參? :$ws對象? ? $fd? 客戶端標識符(用戶id)
著重 注意:$fd,這是基于TCP的客戶端的唯一標識芯砸。在swoole官方文檔中萧芙,韓老大已經寫的很清楚了,
這個$fd假丧,
1.自增的
2.有限(max:1600萬)
3.可復用(但同一個server中双揪,不會重復)
(番外魚:有的人認為,有最大值包帚,且可復用渔期,這樣會限制服務。并且崇洋媚外,殊不知Linux最大支持連接數是64K,幾位65536疯趟,如果自己基于swoole寫的服務拘哨,真的達到了同時在線人數1600w+,并且單服務器信峻。那么宅静,什么話都別說,膜拜)
思考:服務怎么和實際業(yè)務完美的結合站欺,綁定,映射實現纤垂。
途徑:DB矾策,redis,memcache峭沦,apc贾虽,等等。
1.當客戶端發(fā)來請求吼鱼,并攜帶uid,或用戶名等(業(yè)務中的唯一標識)
2.建立連接時蓬豁,存入? ? ? ? ? ? ? 綁定,產生映射關系菇肃。? ?$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ā)送琼稻,直到客戶端已經關閉吮螺,此時服務端發(fā)送的消息會在tcp層,因為發(fā)送超時帕翻,而關閉鸠补。
php的發(fā)展,在突破自身瓶頸之后嘀掸,不在是web小王子紫岩,而是可以百變金剛。phper在不止步于業(yè)務層面上更進一步横殴,相反被因,phper能實現更多的業(yè)務需求。
我為人人衫仑,人人為我梨与;美美與共,天下大同文狱;