示例:
http://24.igd.cc/workerman/page?caihaibin=ok
外部使用demo
http://24.igd.cc/workerman_remote/page?caihaibin=ok
http://gxu.igd.cn/workerman_remote/page?caihaibin=ok
(端口只有一个, 多个项目使用同一个workerman,通过特殊机制,实现将workerman请求转发到yii,并共享两边的sessiono数据,支持wss)
需要明确一个关键点,workerman本身是一个独立的运行容器,类似 apache+php的概念,独立运行.
因为 workerman 是一个独立的脚本容器,所以这类代码
lib ( ‘workerman/Gateway.php’ );
\GatewayClient\Gateway::joinGroup ( State ( ‘client_id’ ), WebSocketTools::KEY_PRE . ‘test’ );
其实比较像调用workerman的接口,实现相关功能.需要理解这块,所以两者有一定的时间差,这块初试化时,必须认login推送返回的消息为准,做为完全建立两者通讯的标志.如果没有,页面应当进行刷新,再次进行连接.有时websocket open是成功的,但是login消息也会没有推送回来,表示之前的网络通讯出了问题.当做不成功.
workerman 游戏的两种模式
第一种:
一种频率不高的,几秒甚至十几秒点一次的,如猜拳,24点小游戏.直接使用post调用yii动作实现游戏逻辑.
第二种:
频率非常高的,类似数钱,一秒会有数次请求的,全部走workerman session,不经过yii session 和数据库. 前台屏幕数据显示,可通过gatewayclient获取workerman所有的会话数据,再根据数据进行排名显示. 当比赛结束时,再将数据插入数据库.
//===============发送workerman 内部参数,用于直接调用workerman动作===============
// 自定义一个key 和 value ,一秒内多次推送也不影响性能
ws.send(JSON.stringify({model:’__workerman’,action:’set_value’,value_key:’score’,value_value:Math.random(0)}));
//===============发送workerman 内部参数,用于直接调用workerman动作
//gateway 获取session数据,不同项目,分组前缀必须不同,防止冲突
Gateway::getAllClientSessions ( WebSocketTools::KEY_PRE . ‘test’ )