本文所述PHP框架Swoole定时器Timer特性分析具有很好的实用价值,值得PHP程序开发人员学习借鉴。具体分析如下:
首先,在各种业务型系统中,往往需要服务器在后台扫描相关数据,触发相应的统计、通知等操作。
比如对于一个项目管理系统,需要每天的特定时间内,统计每项任务的执行、到期情况、整个项目的进度等等,根据统计情况,做相应通知处理;
这样一个场景,如何编程实现?
用一般的编程方式,是无法实现自动触发与统计的。当然,简单的思路,是利于系统的cron job机制。但这种方式,对于配置及可靠性方面,需要比较多的人为操作因素。
Swoole是一个使用c开发的php扩展,通过php就可以实现高性能web服务器,同时,还内置了定时器Timer、任务队列Task特性。这样,基于swoole,你可以在程序层面控制实现方式,减少对外部工具 - 独立的消息队列服务器、定时任务管理工具等的依赖性。
swoole的强大之处就在与其进程模型的设计,既解决了异步问题,又解决了并行。用法如下:
swoole_server_addtimer($serv, 10);
第二个参数是定时器的间隔时间,单位为秒。swoole定时器的最小颗粒是1秒。支持多个定时器。注意不能存在2个相同间隔时间的定时器。 增加定时器后需要写一个回调函数。
具体代码如下:
swoole_server_handler($serv, 'onTimer', my_OnTimer); function my_OnTimer($serv, $interval) { echo "Timer[$interval] is call\n"; }
Task模块,用来做一些异步的慢速任务,比如webim中发广播。类似node.js,假如有10万个连接,要发广播时,那会循环10万次,这时候程序不能做任何事情,不能接受新的连接,也不能收包发包。
而swoole不同,丢给task进程之后,你的reactor,worker照跑不误。任务完成后会异步地通知worker进程告诉它此任务已经完成。
当然task模块的作用还不仅如此,实现PHP的数据库连接池,异步队列等等,还需要进一步挖掘。
感兴趣的读者可以测试一下本文所述实例代码,并根据自身项目需求进一步挖掘其用法。
稳定性: 2 - 稳定的 timer 模块暴露了一个全局的 API,用于在某个未来时间段调用调度函数。 因为定时器函数是全局的,所以使用该 API 无需调用 require('timers')。 Node.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API,除了它使用了一个不同的内部实现,它是基于 Node.js 事件循环构建的。 Immediate 类 该对象是内部创建的,并
毫秒精度的定时器。底层基于epoll_wait和setitimer实现,数据结构使用最小堆,可支持添加大量定时器。 在同步IO进程中使用setitimer和信号实现,如Manager和TaskWorker进程 在异步IO进程中使用epoll_wait/kevent/poll/select超时时间实现 性能 底层使用最小堆数据结构实现定时器,定时器的添加和删除,全部为内存操作,因此性能是非常高的。
基于MVC设计模式,采用OOP编程思想 跨平台、跨服务器,支持Apache、Nginx、Mysql、PHP5.0以上版本 单一入口,方便对项目整体控制 支持多项目部署 支持二级域名部署,二级域名可对应到指定控制器 支持短URL,支持伪静态,强大的路由功能 ORM对象关系映射,像操作对象一样去操作数据表 内置强大的CURD功能,操作数据库更方便 页面编译机制,生成模板缓存 支持HTML静态缓存,速度
EasySwoole对定Swoole时器进行了封装。 loop //10秒执行一次 Timer::loop(10*1000,function (){ Logger::getInstance()->console("this is timer"); }); delay //10秒后执行一次 Timer::delay(10*1000,function (){ Logger::get
boolean WorkermanLibTimer::del(int $timer_id) 删除某个定时器 参数 timer_id 定时器的id,即add接口返回的整型 返回值 boolean 示例 use WorkermanWorker; use WorkermanLibTimer; require_once __DIR__ . '/Workerman/Autoloader.php'; $tas
int WorkermanLibTimer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true]) 定时执行某个函数或者类方法。 注意:定时器是在当前进程中运行的,workerman中不会创建新的进程或者线程去运行定时器。 参数 time_interval 多长时间执行一次