swoole设置定时器
思考:
比如新闻排行榜、商品排行榜,一般都不是即时生成的。(因为数据量大、并发高)
那么怎么做呢?
1、结合消息队列触发后台一个任务
2、结合定时任务,定时生成一些静态资源
swoole提供了类似JavaScript的setInterval
/setTimeout
异步高精度定时器,粒度为毫秒级。
https://wiki.swoole.com/wiki/page/480.html
我们来简单测试一下:
<?php
$serv = new swoole_server("10.211.55.17",9501);
$serv->on("WorkerStart",function ($serv,$woker_id){
if ($woker_id == 0){
//每隔1000ms触发一次
swoole_timer_tick(1000, function ($timer_id) {
echo "hello\n";
});
}
});
$serv->on("receive",function ($serv,$fd,$from_id,$data){
$serv->send($fd,"Server:".$data);
});
$serv->start();
果然是每1秒钟(1000毫米)打印一次hello
。
easyswoole定时器
easyswoole框架中对原生的毫秒级定时器进行了封装,以便开发者快速调用 Swoole 的原生定时器。
文档地址:
https://www.easyswoole.com/Manual/2.x/Cn/_book/Advanced/timer.html
Crontab 定时器
EasySwoole支持用户根据Crontab规则去添加定时器。时间最小粒度是1分钟。
文档地址:
https://www.easyswoole.com/Manual/2.x/Cn/_book/Component/crontab.html
EasySwooleEvent.php
中 use EasySwoole\Core\Component\Crontab\CronTab;
public static function mainServerCreate(ServerManager $server,EventRegister $register): void
{
CronTab::getInstance()->addRule('test1','@daily',function (){
//每天执行的任务
//... 比如统计前一天销售最好的商品
// 这这里完成统计查询写入数据库
})->addRule('test2','*/1 * * * *',function (){
//每一分钟执行的任务
//...比如订单超时状态的监控
});
}
能在程序代码里写Crontab计划任务
比在linux系统中方便多了。