系统内置了一个秒级定时器功能:
- 运行方式
php think timer
这个命令应当被守护进程守护后台运行
开发方式
在定时任务配置中填写配置,其中要填写访问的地址,比如说本站的一个控制器方法,然后把逻辑写道控制其中。
配置
打开定时器配置文件:app/common/command/timer/config.php
,
注意这个文件并不在
config
目录下
内容如下:系统内置了一个定时器demo
<?php
return [
[
'name'=>'http_demo', // 定时任务的名称,不能重複
'type'=>'site', // 定时任务的类型,默认只支持site,你也可以重写定时器命令行以支持其他命令
'target'=>'/tools/timer.ResetPassword/do', // 要访问的地址,如果不是以https开头,那么以后台的系统配置中读取相关配置,如果没有配置则不执行
'frequency'=>600 // 执行频率,单位:秒,填写10,则每10秒过后执行一次
]
];
以上配置表示每过10分钟请求一次url,在本案例中请求的地址是:
http://admin.demo.ulthon.com/tools/timer.ResetPassword/do
案例中的重置密码功能只有在演示模式下才能使用
使用定时器需要现在系统配置中设置站点域名:
这时你可以在tools应用下新建你自己的控制器了,这样每秒都会被请求。
这些请求在这一次定时任务中是异步执行的,具体请参考 guuzle的异步请求,一般来讲延迟是执行最长的那次请求,比如有三个请求,前两个1秒就执行完了,第三个执行了3秒,那么这次定时任务会持续3秒。
定时任务每次都是阻塞的,也就是说你的定时任务业务不会出现并发的情况,除非把同一个请求地址配置了两次,具体可以看一下定时器的源码。
这样的定时任务好处:
- 不会出现并发情况
- 定时任务的业务逻辑随时更新(控制器的代码随时可修改)
这样的定时任务并不是每秒执行,最终的频率一般是1秒+执行耗时
定时器的控制器
定时器会以http的方式发起请求,所以我们写一个标准的控制器即可,但是为了更健全的功能,我们应当做一个防刷机制,可以参考系统中的案例,继承TimerController.php
,它提供了一个简单防刷机制。
<?php
declare(strict_types=1);
namespace app\tools\controller\timer;
use app\common\controller\TimerController;
use think\facade\Console;
class ResetPassword extends TimerController
{
protected $frequency = 600; // 只要定义一个属性即可。
public function do()
{
if (!env('adminsystem.is_demo', false)) {
return $this->error('本功能只有在演示环境下在能使用', '', '/');
}
$output = Console::call('admin:resetPassword', [
'--password=123456'
]);
return $output->fetch();
}
}
一般的只要定义frequency
属性即可,如果不定义或者不是数字,则不会不执行防刷检测,这时你可以手动调用防刷检测:
$this->protectVisit(600);
定制
在配置项中预留了一些配置项,如比type
,你可以自定义它,然后按照你自己的业务去处理,比如执行一个command
,或者执行一个函数,实例化一个类。
$type = $config_item['type'];
switch ($type) {
case 'site':
'''默认逻辑'''
break;
default:
$output->writeln(date('Y-m-d H:i:s') . 'unsupport type:' . $type);
break;
}
原文标题:内置定时器
原文文档:ulthon_admin
原文地址:https://doc.ulthon.com/read/augushong/ulthon_admin/timer/zh-cn/2.x.html
原文平台:奥宏文档