一次WebSocket项目实战后总结的经验
项目需求(部分)
宴会参与者微信扫码进入游戏进行签到,签到后头像出现在大屏幕上,经过数轮抽奖最终决出3位终极大奖获奖者。获奖者扫码进入赛跑页面,摇动手机跑步。大屏幕上实时显示3位获奖者的头像和跑步进度(头像从左向右移动)。到达终点后手机端显示完成及耗时
实现思路
-
Mysql
记录参与者信息、状态 - 每当一个参与者签到时,则将其信息存入
Redis
队列,等待大屏幕AJAX
轮询获取 - 使用
Workerman
的WebSocket
实现的手机摇动实时跑步及大屏幕显示效果
经验总结
选择合适的通讯方式
能不用WebSocket就不要用!
能不用WebSocket就不要用!
能不用WebSocket就不要用!
- WebSocket不是http协议,不支持Cookie等
- 处理WebSocket服务需要登录shell,例如启停
- WebSocket对网络环境要求很高
如果非要用的话,别再翻例程、造轮子了,直接上Workerman吧!
如果要跟前端配合的话,别犹豫,让前端上SocketIO吧!
然后你再来个基于Workerman的phpSocket.io吧,与前端完美配合!
好好用框架,能省下不少时间、少踩不少坑。去TM的性能
我就不告诉你之前我跟前端没沟通好,结果我用的原生WebSocket,然后她用的SocketIO。后来发现SocketIO比较方便好用,于是我那部分代码推了重写了……
注意数据库连接是否正常
如果要在WebSocket服务中使用数据库的话,切记使用前先ping
一下或直接重新连接,确保数据库连接可用。因为WebSocket服务是长时间开启的,数据库连接容易超时,然后报出一堆莫名其妙的错误,例如Error while sending QUERY packet. PID=25370.
,看的一头雾水。当初还以为是服务不稳定,每隔一阵子就登录shell上去重启一下ws服务,浪费了不少时间
使Workerman支持pathinfo
Workerman原生的启动方式为php start.php start
但有些时候,我们希望它能够支持pathinfo传参,并且跟着框架的路由启动对应的方法来处理WebSocket
例如php index.php mainController/websocketAction start
这时候就要修改Workerman(linux版)的595-596
行代码了(parseCommand方法)
将$argv[1]
改为$argv[2]
、$argv[2]
改为$argv[3]
即可
其实就是获取参数的序号啦
预留重置接口,而不是重启服务
WebSocket服务一旦启动,一些变量将一直有效。如果需要进行多次测试的话,则不得不多次重启WebSocket服务以清除它们
实际上,只要预留一个重置接口,用于初始化变量、数据库用户信息等即可
别像我刚开始那样傻乎乎的每次都打开shell重启服务,太累太烦太费时间了
后记
最怕的就是做现场活动的项目了,现场随便出个BUG都是要死啊
尤其是活动进行时,那叫一个胆战心惊
不过最终活动还是完美落幕了,可喜可贺
松了一口气,来水一篇博文放松一下好了
差不多在一样的时间用Workerman的WebSocket+PHP+MySQL做了一个功能类似的微信扫码签到工具,不过并没有游戏,仅仅是个防止代签的签到工具,跨屏WEB端也是用的SocketIO~~~
唔,Workman_(:з」∠)_
挺好使的
是的,不过我还没开始动工_(:з」∠)_
的确,一个项目的流程大概就是这个样子的