澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

多任务秒级定时器的实现方法,多任务秒级定时

来源:http://www.bhtsgq.com 作者:计算机知识 人气:180 发布时间:2019-09-26
摘要:描述 描述 前段时间在店堂安顿crontab的时候,突发奇想是不是能够用PHP去贯彻多少个反应计时器,颗粒度到秒级就好,因为crontab最多到分钟等第,同不时候也科研了一晃用PHP去落成的放

描述

描述

前段时间在店堂安顿crontab的时候,突发奇想是不是能够用PHP去贯彻多少个反应计时器,颗粒度到秒级就好,因为crontab最多到分钟等第,同不时候也科研了一晃用PHP去落成的放大计时器还真不太多,Swoole 扩展里面到落到实处了二个纳秒级的沙漏很连忙,但毕竟不是纯PHP代码写的,所以最终依然思考用PHP去完成贰个放大计时器类,以供就学参考。

图片 1

日前在市肆布置crontab的时候,突发奇想是或不是能够用PHP去贯彻三个电火花计时器,颗粒度到秒级就好,因为crontab最多到分钟等第,同时也调查钻探了须臾间用PHP去贯彻的沙漏还真不太多,Swoole 扩张里面到达成了三个纳秒级的反应计时器很迅猛,但终归不是纯PHP代码写的,所以最终照旧思量用PHP去贯彻叁个反应计时器类,以供就学参照他事他说加以考察。

实现

在达成放大计时器代码的时候,用到了PHP系统自带的多个扩大

Pcntl - 多进程扩展 :

最首要正是让PHP能够同不时候拉开非常多子进度,并行的去管理局地职责。

Spl - SplMinHeap - 小顶堆

多任务秒级定时器的实现方法,多任务秒级定时器。多个小顶堆数据结构,在落到实处定时器的时候,采取这种组织功效照旧不错的,插入、删除的年华复杂度都以O ,像 libevent 的停车计时器也在 1.4 版本之后选取了这种数据结构在此以前用的是 rbtree,若是固然使用链表可能固定的数组,每回插入、删除恐怕都亟待再一次遍历大概排序,还是有一定的品质问题的。

图片 2

实现

流程

图片 3大要流程

图片 4

在落到实处反应计时器代码的时候,用到了PHP系统自带的四个扩张

说明

1、定义反应计时器结构,有哪些参数之类的.2、然后一切挂号进大家的电磁关照计时器类 提姆er.3、调用定时器类的monitor方法,初叶开展监听.4、监听进度便是叁个while死循环,不断的去看时间堆的堆顶是或不是到期了,本来思量每秒循环看三次,后来一想每秒循环看贰遍依旧有个别难点,借使刚幸而大家sleep的时候反应计时器有到期的了,那大家就不能够立时去精准实践,恐怕会有延时的高危机,所以依旧接纳 usleep 飞秒级的去看还要也能够将经过挂起缓慢消除 CPU 负载.

图片 5

Pcntl - 多进度扩大 :

代码

 /*** * Class Timer */ class Timer extends SplMinHeap { /** * 比较父节点和新插入节点大小 * @param mixed $value1 * @param mixed $value2 * @return int */ protected function compare($value1, $value2) { if ($value1['timeout'] > $value2['timeout']) { return -1; } if ($value1['timeout'] < $value2['timeout']) { return 1; } return 0; } /** * 插入节点 * @param mixed $value */ public function insert { $value['timeout'] = time()   $value['expire']; parent::insert; } /** * 监听 * @param bool $debug */ public function monitor($debug = false) { while (!$this->isEmpty { $this->exec; usleep; } } /** * 执行 * @param $debug */ private function exec { $hit = 0; $t1 = microtime; while (!$this->isEmpty { $node = $this->top(); if ($node['timeout'] <= time { //出堆或入堆 $node['repeat'] ? $this->insert($this->extract : $this->extract(); $hit = 1; //开启子进程 if (pcntl_fork { empty($node['action']) ? '' : call_user_func($node['action']); exit; } //忽略子进程,子进程退出由系统回收 pcntl_signal(SIGCLD, SIG_IGN); } else { break; } } $t2 = microtime; echo ($debug && $hit) ? '时间堆 - 调整耗时: ' . round($t2 - $t1, 3) . "秒rn" : ''; } }

实例

$timer = new Timer();//注册 - 3s - 重复触发$timer->insert(array('expire' => 3, 'repeat' => true, 'action' => function(){ echo '3秒 - 重复 - hello world' . "rn";}));//注册 - 3s - 重复触发$timer->insert(array('expire' => 3, 'repeat' => true, 'action' => function(){ echo '3秒 - 重复 - gogo' . "rn";}));//注册 - 6s - 触发一次$timer->insert(array('expire' => 6, 'repeat' => false, 'action' => function(){ echo '6秒 - 一次 - hello xxxx' . "rn";}));//监听$timer->monitor;

图片 6实施结果

也测量试验过比较极端的情事,同偶尔候一千个电磁照看计时器1s一体到期,时间堆全部调解完仅需 0.126s 那是没难点的,可是每调治完二个电磁照应计时器就要求去开启二个子历程,那块恐怕比较耗费时间了,有非常的大大概1s管理不完那一千个,就能影响后一次监听继续接触,可是不开启子进度,例如直接施行相应依然得以拍卖完的。。。。当然鲜明有更加好的形式,近年来只得想到这么。

图片 7

最首要正是让PHP可以何况开启非常多子进程,并行的去管理局地任务。

结束

上述仅供就学参谋,有标题请马上指正,共同学习!!

图片 8

Spl - SplMinHeap - 小顶堆

图片 9

本文由澳门新葡亰发布于计算机知识,转载请注明出处:多任务秒级定时器的实现方法,多任务秒级定时

关键词: php 定时器 PHP分享

最火资讯