swoole 点对点发送消息推送

swoole+webSocket  消息推送,或则聊天室,实现。php

先上代码,(上菜。。。。)点对点,简单(客户发送,服务回复。)html

点对全部,广播jquery

见图所示:参数详解web

 

/**
 * 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、TCP六、UDP六、UnixSocket Stream/Dgram 6种  (可选)
 */
// 注:【on 】和jquery相似
采用匿名函数   $ws ,$fd   两个形参   :$ws对象    $fd  客户端标识符(用户id)

着重 注意:$fd,这是基于TCP的客户端的惟一标识。在swoole官方文档中,韩老大已经写的很清楚了,redis

这个$fd,后端

1.自增的服务器

2.有限(max:1600万)swoole

3.可复用(但同一个server中,不会重复)tcp

(番外鱼:有的人认为,有最大值,且可复用,这样会限制服务。而且崇洋媚外,却不知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能实现更多的业务需求。

 

我为人人,人人为我;美美与共,天下大同;