TP5.0.24 + Workerman +定时任务

  

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 +定时任务