文档章节

Swoole入门(4)☞创建毫秒级定时器

ali安东尼
 ali安东尼
发布于 2017/09/12 14:51
字数 801
阅读 16
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

###crontab服务 VS 基于swoole的定时器

一般开发者都是使用linux自带的crontab定时处理服务,crontab服务够稳定,有日志,基于服务器,非常好用;但是有个缺点就是只支持分钟时间级别的定时器。

而swoole的timer定时器完全可以弥补这个缺点,支持毫秒级的定时器,同时支持异步操作

###timer定时器

timer定时器基于Reactor线程,在Worker进程和Task进程使用。

timer定时器基于epoll的timeout机制实现。

timer定时器使用最小堆数据结构存放定时任务,触发时间越短越靠近堆顶,大大提高了检索效率。

###示例代码

    <?php          class Test     {         public $index = 0;     }          class Server     {         private $serv;         private $test;              public function __construct() {             $this->serv = new swoole_server("0.0.0.0", 9501);             $this->serv->set(array(                 'worker_num' => 8,                 'daemonize' => false,                 'max_request' => 10000,                 'dispatch_mode' => 2,             ));             $this->serv->on('Start', array($this, 'onStart'));             $this->serv->on('Connect', array($this, 'onConnect'));             $this->serv->on('Receive', array($this, 'onReceive'));             $this->serv->on('Close', array($this, 'onClose'));             $this->serv->on('WorkerStart', array($this, 'onWorkerStart'));                  $this->serv->start();         }         public function onStart( $serv ) {             echo "Start\n";         }         public function onConnect( $serv, $fd, $from_id ) {             echo "Client {$fd} connect\n";         }         public function onClose( $serv, $fd, $from_id ) {             echo "Client {$fd} close connection\n";         }              public function onWorkerStart( $serv , $worker_id) {             if( $worker_id == 0 )             {                 $this->test=new Test();                 $this->test->index = 1;                 swoole_timer_tick(1000, array($this, 'onTick'), "Hello");             }         }              public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {             echo "Get Message From Client {$fd}:{$data}\n";                        echo "Continue Handle Worker\n";         }              public function onTick($timer_id,  $params = null) {             echo "Timer {$timer_id} running\n";             echo "Params: {$params}\n";                          echo "Timer running\n";             echo "recv: {$params}\n";                  var_dump($this->test);         }     }          $server = new Server();

####代码输出     root:/var/www/html/silence/swoole/timer# php timer.php      Start     Timer 1 running     Params: Hello     Timer running     recv: Hello     object(Test)#5 (1) {       ["index"]=>       int(1)     }     Timer 1 running     Params: Hello     Timer running     recv: Hello     object(Test)#5 (1) {       ["index"]=>       int(1)     }

####代码流程

定时器在worker进程启动时就启动,因为不希望每个worker进程都启动该定时器,所以用了workerid进行判断,只在第一个worker进程中启动。

swoole_timer_tick(int $ms, callable $callback, mixed $user_param);

设置一个间隔时钟定时器,该定时器会一直持续触发,直到调用swoole_timer_clear清除该定时器。

$ms 指定时间,单位为毫秒

$callback_function 时间到期后所执行的函数,必须是可以调用的。

$user_param 可以传一些业务参数, 该参数会被传递到$callback_function中. 如果有多个参数可以使用数组形式。

注意:

定时器仅在当前进程空间内有效

定时器是纯异步实现的,不能与阻塞IO的函数(如sleep()函数)一起使用,否则定时器的执行时间会发生错乱

与其相对立的是swoole_timer_after()函数,还函数只会调用一次。

onTick($timer_id,  $params = null);上文中的定时器异步回调函数是该函数。

$timer_id 定时器的ID,可用于swoole_timer_clear清除此定时器

$params 由swoole_timer_tick传入的第三个参数

swoole_timer_clear(int $timer_id)是使用定时器ID来删除定时器。

$timer_id,定时器ID,调用swoole_timer_tick、swoole_timer_after后会返回一个整数的ID

swoole_timer_clear不能用于清除其他进程的定时器,只作用于当前进程

###结语

接下来继续给大家讲讲进程相关知识,同时学习对swoole进程的使用。

由睿江云人员提供,想了解更多,请登陆www.eflycloud.com

ali安东尼
粉丝 3
博文 192
码字总数 173101
作品 0
广州
私信 提问
加载中
请先登录后再评论。
Swoole入门到实战(一):PHP7&Swoole源码安装、玩转网络通信引擎、异步非堵塞IO场景

一、PHP7源码安装和Swoole源码编译安装 1.1 PHP7源码安装 1.1.1 获取源码与安装 获取PHP7源码: 源码执行文件放在:目录下 1.1.2 简化PHP执行命令 命令=命令的绝对路径 source FileName 作用...

mickelfeng
2018/05/14
0
0
EasySwoole 2.x 正式发布,企业级服务框架

EasySwoole EasySwoole 是一款基于Swoole Server 开发的常驻内存型的分布式PHP框架,专为API而生,摆脱传统PHP运行模式在进程唤起和文件加载上带来的性能损失。EasySwoole 高度封装了 Swoole...

easySwoole
2018/03/26
5.3K
28
[Swoole] 在Ubuntu下安装、快速开始

本文主要讲述在 Ubuntu 下编译安装 Swoole,并根据官方文档给出的demo进行了测试和搬运,包括:TCP服务器、UDP服务器、HTTP服务器、WebSocket服务器、异步客户端、定时器和协程相关,通过模仿...

osc_o1mwzw8v
04/16
3
0
2018年swoole实战3-异步毫秒定时器

继上篇 2018年swoole实战2-异步非阻塞投递任务 项目中需要使用定时器时,crontab是常用的选择,不过crontab的粒度太大,最小时间单位是分钟级别,如果我们要设置秒级,甚至毫秒级的定时器,c...

章鱼喵_
2018/07/27
0
0
PHP之高性能I/O框架:Libevent(三)

Swoole 里也提供了一些直接操作底层事件循环的接口,可将其他扩展创建的、PHP代码中扩展创建的等加入到Swoole的中。 文档:https://wiki.swoole.com/wiki/page/242.html 这里我也简单介绍一下...

osc_jx98daik
2018/07/07
2
0

没有更多内容

加载失败,请刷新页面

加载更多

element ui设置表格表头高度和每一行的高度

填坑记录:今天用element ui的表格组件做用户信息展示,直接拉取的官网的代码过来,发现表头和每一行都太高了,如下:      因为第一次使用element ui的表格组件,不太清楚会遇到这样的坑...

osc_bwy4ep83
1分钟前
0
0
逆向破解之160个CrackMe —— 001

CrackMe —— 001 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员...

osc_xmvqghwh
3分钟前
0
0
【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4

【.NET Core项目实战-统一认证平台】开篇及目录索引 上篇文章介绍了IdentityServer4的源码分析的内容,让我们知道了IdentityServer4的一些运行原理,这篇将介绍如何使用dapper来持久化Ident...

osc_9ntog5yq
4分钟前
0
0
用SV写一个蒙哥马利模乘的参考模型

前言 往期推送过一个蒙哥马利算法的介绍,如果要实现蒙哥马利模乘的硬件模块,那么一个参考模型是必不可少的,这一期将利用SV实现一个简单的参考模型,这个参考模型可以直接用于功能仿真 根据...

osc_f9krav3q
5分钟前
0
0
缓存数据库

缓存数据库 NoSQL(NoSQL = Not Only SQL),意即泛指非关系型数据库,(关系型数据库mysql,sqlite,oracle,即存在强烈的数据关系),是对不同于传统的关系型数据库的数据库管理系统的统称。...

osc_lqb3vmrs
6分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部