swoole ---websocket介绍 2019-01-24

    17年时做了个网站,需求是当有人下单时,要推送给平台所有用户。这点就坑了,没玩过长连接。当时也不知道长连接是啥。

    然后找到了swoole,当时由于项目赶,来不及学习就接入一个不知道什么平台的推送。


    收费很坑爹就是了。但是还好,我们是给人家接的外包功能,那个老板出钱。。

    不过也是很坑,毕竟但是找的第三方服务很菜(个人的)。后来项目赶往了移交给那老板,就开始研究websocket,发现有两个不错的东西。

    1. swoole :https://www.swoole.com/

    2. workerman : https://www.workerman.net/


    具体的东西我就不讲了,我们是挑swoole看了下,决定撸他。跟着官方文档搭了搭玩了下。后来在tp5.1上面发现swoole的扩展。卧槽撸他。


    刚好宝塔也有一键安装php扩展-swoole 说撸就撸。

    当然我是撸比较简单的。


    首先搭建好php环境。我用7.3,然后下载个mongodb , 刚好宝塔也有,就是没帮忙装mongodb的扩展。没事百度一下很简单就传上去了。

    mongodb我们创建2张表(由于简单功能开发,就不详细建立字段,也不考虑安全问题):

    商户表:除了自身的id外还存储2个值  ser_key 以及 cli_key (服务端推送消息的key和客户端注册ws的key)

    客户接口的表:除了id外 还是存储2个字段: cli_key fd (客户端注册的key 以及 websocket的fd)

    (由于只是做简单的功能,所以字段存储少了,他们的网站要求充值10元可以下发1000次推送那么就该在表里加下用户目前能推送的次数等等字段,我这里就不加了)


    逻辑:

    1. 首先商户获取我们的两个key 然后我们把两个key存储到商户表里


    image.png


    2.商户拿到这两key 把客户端的key 放到ws里面,然后握手完马上发cli_key给websocket服务器(服务端我用json接收所以这里用json发送)

    image.png


    3.当客户端发送cli_key给我们时我们存储起来 把客户端的fd和 cli_key一起存储(我这里就一条,如果多个客户端将有多条)

    image.png


    4.商户的服务端请求我们的接口实现消息推送给所有客户端(如果要推送给给某些客户端,建议对刚才设计的表优化一下,逻辑稍微改一下),可以用post也可以get 当然要传递参数 ser_key msg 一个是我们给商户的商户key,另一个是用户要推送的消息。


    image.png


    5.当websocket服务端的http接口接收到用户发送消息的请求时,拿ser_key去商户表找出cli_key,然后用cli_key到客户端表找出所有fd,然后每个fd进行push(我目前写在http接口里,建议大家把这种相对耗时的功能放进task任务里),push完后我们可以看到客户端接收到发来的消息了

    image.png


    6.当客户端退出时我们在onClose回掉里面把该fd存储于客户端的表的那条数据del掉。一个回环完成


    由于目前我的代码比较坑,不贴代码了,上面的post请求是随便百度扣的,不想写,其实用get方法也可以请求。。。


    类似这样的功能我们能拿来干啥呢,大家自己想想哈哈。。。


    ps:

    普通http请求只能客户端去找服务端要数据。

    而websocket则可以服务端主动给客户端推送数据


    swoole性能确实挺强大,处理效率挺高。

    这是swoole官网的一条消息:https://wiki.swoole.com/wiki/page/975.html

    Swoole领跑动态语言第一   但是!!!swoole把php变成静态的了!


    感谢swoole团队,对行业做出的贡献!