swoole+webSocket 消息推送,或则聊天室,实现。
先上代码,(上菜。。。。)点对点,简单(客户发送,服务回复。)
点对所有,广播
见图所示:参数详解
/*** 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,几位65535,可ulimit 调参,如果自己基于swoole写的服务,真的达到了同时在线人数1600w+,并且单服务器。那么,什么话都别说,膜拜)
思考:服务怎么和实际业务完美的结合,绑定,映射实现。
途径:DB,redis,memcache,apc,等等。
1.当客户端发来请求,并携带uid,或用户名等(业务中的唯一标识)
2.建立连接时,存入 绑定,产生映射关系。 $fd1 == uid10086 $fd2 == uid10010
3.业务处理,点对点发送,客户端传来。想要发送给B,B的uid,同时uid_B发来 ,此时查找当前的uid_B的映射$fd,然后发送。
点对多,同样,从映射中获取,并遍历,$server->push($fd,“我是谁谁,我想告诉你们”);
4.何时取消映射关系?何时取消可以保证复用的时候,关系没有错乱?
当然是在关闭的时候取消当前的映射关系,以防止在复用的时候导致关系的错乱。
以上仅为大概思路,具体操作当中,还要考虑到心跳检测,以防止客户端断电,等意外因素。
心跳检测的思路:
方法1.客户端在固定的时间间隔中发送请求,后台服务判断,某个$fd,在超出时间间隔范围外,仍没有给我汇报,则宣布死亡
方法2.服务端主动打发送信息,客户端可返回信息,可不返回信息。
A,客户端返回信息,此时后端接收到信息,知道该连接还活着。
B,傲娇的客户端不返回信息,后端仍然孜孜不倦的发送,直到客户端已经关闭,此时服务端发送的消息会在tcp层,因为发送超时,而关闭。
php的发展,在突破自身瓶颈之后,不在是web小王子,而是可以百变金刚。phper在不止步于业务层面上更进一步,相反,phper能实现更多的业务需求。
我为人人,人人为我;美美与共,天下大同;