文档章节

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

ali安东尼
 ali安东尼
发布于 2017/09/12 14:51
字数 801
阅读 4
收藏 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
广州
2018年swoole实战3-异步毫秒定时器

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

章鱼喵_
07/27
0
0
PHP的异步并行扩展Swoole发布1.7版本

Swoole 1.7.0 发布了,该版本主要改进内容包括: reactor线程与writer线程合并 对send优化,加入out_buffer机制 增加AIO异步读写文件的API 增加DNS异步查询函数 swooleclient在php-fpm或apa...

matyhtf
2014/04/17
6K
39
Swoole入门指南:PHP7安装Swoole详细教程

Swoole简介 Swoole是:PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,...

阿泽Aze
01/05
0
1
swoole-1.7.7 发布,Http 服务器性能大幅提升

swoole-1.7.7 发布,内置Http服务器性能是Node.js的12倍 PHP的异步并发扩展swoole发布了 1.7.7 版本,此版本主要有: 增加对cygwin环境的支持 增加单次定时器的after接口 onClose事件调整为在...

matyhtf
2014/10/28
8.7K
65
PHP的异步并行网络扩展Swoole已发布1.7.5版本

PHP的异步并行网络扩展Swoole今天发布了最新的1.7.5版本。 项目主页:http://www.swoole.com/ 文档页面:http://wiki.swoole.com/ 源代码:https://github.com/swoole/swoole-src 1.7.4版本:...

matyhtf
2014/09/10
2.7K
31

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
3
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
16
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部