1。安装Workerman
安装GatewayWorker内核文件(不包含start_gateway。php start_businessworker.php等启动入口文件),直接上作曲家
<代码>作曲家需要workerman/gateway-worker 代码>
2。创建Workerman启动文件
创建一个自定义命令类文件来启动插座服务端,新建
<代码>应用程序/推/命令/Workerman.php 代码>
<代码>名称空间应用\ \推命令; 使用Workerman \工人; 使用GatewayWorker \注册; 使用GatewayWorker \ BusinessWorker; 使用GatewayWorker \网关; 使用认为\ \控制台命令; 使用认为\ \控制台输入; 使用认为\控制台输入\ \论证; 使用认为\控制台输入\ \选择; 使用认为\ \控制台输出; 类Workerman扩展命令 { 保护功能配置() { $ this→setName (“workerman”) →addArgument(“行动”,论证::可选的,“行动启动|停止|重启”) →addArgument(“类型”,论证::可选的,“d - d”) →setDescription (' workerman聊天'); } 保护功能(输入美元输入、输出输出美元)执行 { 全球$ argv; (action=削减美元输入→getArgument('行动')); (type=削减美元输入→getArgument('类型'))?“- d”:”; $ argv[0]='聊天'; 美元$ argv[1]=行动; 美元$ argv[2]=类型?“- d”:”; 美元这→开始(); } 供私人使用start () { $ this→startGateWay (); $ this→startBusinessWorker (); $ this→startRegister (); 工人:runAll (); } 私人startBusinessWorker()函数 {//bussinessWorker进程 工人美元=new BusinessWorker ();//员工名称 工人→美元name=' YourAppBusinessWorker ';//bussinessWorker进程数量 工人→美元数=4;//设置处理业务的类,此处制定事件的命名空间 工人→美元eventHandler=\ app \ \控制器\推事件::类;//服务注册地址 工人→美元registerAddress=?27.0.0.1:1238”; } 私人startGateWay()函数 {//网关进程,这里使用文本协议,可以用telnet测试 美元网关=new网关(“websocket://0.0.0.0:8282”);//网关名称,地位方便查看 网关→美元name=' YourAppGateway ';//网关进程数 网关→美元数=4;//本机ip,分布式部署时使用内网ip 网关→美元lanIp=?27.0.0.1”;//内部通讯起始端口,假如网关→美元数=4,起始端口为4000//则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 网关→美元startPort=20003;//服务注册地址 网关→美元registerAddress=?27.0.0.1:1238”;//心跳间隔 网关→美元pingInterval=55; 网关→美元pingNotResponseLimit=1;//心跳数据 网关→美元pingDatahttps://www.yisu.com/zixun/=? } 私人startRegister()函数 { 新注册(“文本://0.0.0.0:1238”); } } 代码>
配置应用程序/命令。php文件
<代码>返回( “app \常见\命令\ Workerman”, ];代码>
3。创建事件监听文件
创建应用程序/推/控制器/事件。php文件来监听处理workerman的各种事件。
<代码> & lt; ? php 名称空间应用\ \推控制器; 使用GatewayWorker \ Lib \网关; 认为\用钩; 使用Workerman \ Lib \定时器; 类事件 {//定时器间隔 静态保护间隔=2美元;//定时器 保护静态计时器美元=零;//事件处理类 保护静态evevtRunClass美元=\ app \ \控制器\ EvevtRun推::类;/* *消息事件回调班 * * */保护静态eventClassName美元=\ app \推\控制器\推::类;/* * *当客户端发来消息时触发 * @param int美元client_id连接id * @param混合美元消息具体消息 */公共静态函数onMessage (client_id美元,美元消息) { (message_data=https://www.yisu.com/zixun/json_decode美元消息,真的); 如果(! $ message_data)返回; 尝试{ 如果(!收取($ message_data['类型']))抛出新\异常(“缺少消息参数类型的);//消息回調处理 $ evevtName=self:: eventClassName美元。“::实例”; 如果(is_callable (evevtName美元)) $ evevtName()→开始($ message_data['类型'],美元client_id, message_data美元); 其他的 抛出新\异常(“消息处理回调不存在。[' + evevtName美元+ ']'); }捕获异常(\ $ e) { var_dump ([ “文件”=祝辞$ e→getFile (), “代码”=祝辞$ e→getCode (), “味精”=祝辞$ e→getMessage (), ‘线’=祝辞$ e→getLine () ]); } }/* * *当用户连接时触发的方法 * @param美元整数client_id连接的客户端 * @return无效 */公共静态函数onConnect ($ client_id) { 网关:sendToClient(美元client_id json_encode(阵列( “类型”=比;“初始化”, “client_id”=比;美元client_id ))); }/* * *当用户断开连接时触发的方法 * @param美元整数client_id断开连接的客户端 * @return无效 */公共静态函数onClose ($ client_id) { 网关:sendToClient(美元client_id json_encode ([ “类型”=祝辞;“注销”, “消息”=祝辞;“客户(美元client_id)” ))); }/* * *当进程启动时 * @param美元整数businessWorker进程实例 */公共静态函数onWorkerStart(工人) {//在进程1上开启定时器每self:: $间隔秒执行 如果工人→美元id===0) { 去年美元=时间(); $任务=[6=比;去年美元,10=比;最后,美元30=比;最后,美元60=比;最后,180美元=比;最后,300美元=比;去年美元]; self:: $计时器=计时器:add (self::美元区间函数()使用(和任务美元){ 尝试{ 美元现在=(); 钩:exec (self:: $ evevtRunClass); foreach(任务秒=美元比;和美元){ 如果((现在-时间)美元祝辞=$ sec) { 现在时间=美元; 钩::exec (self:: $ evevtRunClass task_。美元sec); } } }抓住美元(\ Throwable e) {} }); } }/* * *当进程关闭时 * @param美元整数businessWorker进程实例 */公共静态函数onWorkerStop(工人) { 如果(工人→美元id===0)定时器::德尔(self:: $计时器); } }TP5.0.24 + Workerman +定时任务