php

一次WebSocket项目实战后总结的经验

1615
5
2016-09-04

项目需求(部分)

宴会参与者微信扫码进入游戏进行签到,签到后头像出现在大屏幕上,经过数轮抽奖最终决出3位终极大奖获奖者。获奖者扫码进入赛跑页面,摇动手机跑步。大屏幕上实时显示3位获奖者的头像和跑步进度(头像从左向右移动)。到达终点后手机端显示完成及耗时

实现思路

  • Mysql记录参与者信息、状态
  • 每当一个参与者签到时,则将其信息存入Redis队列,等待大屏幕AJAX轮询获取
  • 使用WorkermanWebSocket实现的手机摇动实时跑步及大屏幕显示效果

经验总结

选择合适的通讯方式

能不用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都是要死啊
尤其是活动进行时,那叫一个胆战心惊
不过最终活动还是完美落幕了,可喜可贺
松了一口气,来水一篇博文放松一下好了

昵称
邮箱
网址
Dreamer的头像 2017-05-06 17:03

差不多在一样的时间用Workerman的WebSocket+PHP+MySQL做了一个功能类似的微信扫码签到工具,不过并没有游戏,仅仅是个防止代签的签到工具,跨屏WEB端也是用的SocketIO~~~

Hstb的头像 2016-10-02 17:39

唔,Workman_(:з」∠)_

mokeyjay的头像 2016-10-02 23:59
mokeyjay 博主

挺好使的

Hstb的头像 2016-10-03 10:45

是的,不过我还没开始动工_(:з」∠)_

工控资料窝的头像 2016-09-10 16:59

的确,一个项目的流程大概就是这个样子的