当前位置: 首页 > 后端技术 > PHP

Swoole学习毫秒定时器(七)

时间:2023-03-29 22:56:27 PHP

一、设置定时器我们一般使用Linux系统自带的定时器crontab来执行比较常规的定时任务,但是有时候它不能满足我们的业务需求,达到不到毫秒,但是Swoole可以帮助我们实现它。看下Swoole官方文档入门指南->快速入门->设置定时器Swoole提供了一个类JavaScript的setInterval/setTimeout异步高精度定时器,粒度为毫秒。使用起来也非常简单。swoole_timer_tick函数相当于setInterval,持续触发。swoole_timer_after函数相当于setTimeout。swoole_timer_tick和swoole_timer_after函数只在约定时间触发一次,返回一个整数,表示可以使用swoole_timer_clear清除定时器ID。参数为定时器ID2.代码实现ws_timer.phpws=newswoole_websocket_server("0.0.0.0",80);$this->ws->set(['enable_static_handler'=>true,//static资源相关设置'document_root'=>"/work/study/code/swoole/demo/static",//static存放路径资源//'worker_num'=>2,//'task_worker_num'=>2,]);$this->ws->on("open",[$this,"onOpen"]);$this->ws->on("消息",[$this,"onMessage"]);//$this->ws->on("task",[$this,"onTask"]);//$this->ws->on("完成",[$this,"onFinish"]);$this->ws->on("close",[$this,"onClose"]);$this->ws->start();}/***监听ws连接事件*@param$ws*@param$request*/publicfunctiononOpen($ws,$request){print_r("Open:".$request->fd."\n");//使用定时任务if($request->fd==1){//每2秒执行一次swoole_timer_tick(2000,function($timer_id){echo"2s:timerId:{$timer_id}";});}}/***监听ws连接消息*@param$ws*@param$frame*/publicfunctiononMessage($ws,$frame){echo"ser-push-message:{$frame->data}\n";//TODO::需要加入我们的业务执行超过10s,所以这里可以使用task异步处理$data=['task'=>1,'fd'=>$frame->fd,];//发布一个任务//$ws->task($data);//定时任务,5s后执行,这里是异步任务,不会阻塞,这里使用闭包swoole_timer_after(5000,function()use($ws,$frame){echo"5s-之后\n";$ws->push($frame->fd,"server-time-after");});$ws->push($frame->fd,"server-push:".date("Y-m-dH:i:s"));}/***交付任务**@param$serv*@param$taskId*@param$workerId*@param$data*/publicfunctiononTask($serv,$task_id,$from_id,$data){//耗时场景10ssleep(10);return"ontaskfinish";//告诉worker}publicfunctiononFinish($serv,$task_id,$data){echo"taskId:{$task_id}\n";//注意:这个$data参数是onTask方法返回的结果:任务完成时,不是onTask方法的参数echo"完成-数据-成功:{$data}\n";}/***监听WebSocket连接关闭事件**@param$ws*@param$fd*/publicfunctiononClose($ws,$fd){echo"clientid-{$fd}isclosed\n";}}$ws_obj=newWs();在服务器端执行脚本:root@5ee6bfcc1310:/work/study/code/swoole/demo/server#phpws_timer.phpOpen:3ser-push-message:Hello-Lilyclientid-1isclosed5s-afterclientid-2isclosed执行浏览器中的客户端代码:ws_task_client.html我们可以看到,打开浏览器等待5秒后,服务端通过定时任务将server-time-after信息推送给客户端。