项目需求(部分)
宴会参与者微信扫码进入游戏进行签到,签到后头像出现在大屏幕上,经过数轮抽奖最终决出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都是要死啊
尤其是活动进行时,那叫一个胆战心惊
不过最终活动还是完美落幕了,可喜可贺
松了一口气,来水一篇博文放松一下好了