系统内置了一个秒级定时器功能:

  • 运行方式
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/621cceeda9ade/zh-cn/2.x.html

原文平台:奥宏文档

2.x