php websocket 实战,一次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都是要死啊

尤其是活动进行时,那叫一个胆战心惊

不过最终活动还是完美落幕了,可喜可贺

松了一口气,来水一篇博文放松一下好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值