ulthon_admin
欢迎 目录和文件规范 系统架构 命名规范 php-cs-fixer public/static目录规范 app/common目录规范 数据库规范 CURD 命令行 表结构 数据库迁移代码 最佳实践 数据库自动缓存 后台菜单导入导出 权限的用法 table数据表格 cols operat _if titleField field selectList valueParser trueHide fieldFormat templet defaultValue search相关 time defaultSearchValue defaultToolbar init formFullScreen toobar modifyReload 控制器 CURD方法 导出 控制器通用验证 dataBrage向js传递参数 组件控件 select 下拉菜单option拼接 lay-submit paste-text粘贴 multiple-columns editor data-upload上传 tag-input标签输入 property-input动态字段输入 data-date时间控件参数 table-data列表选择器 city-picker城市选择器 copy-text 全局监听组件 data-request data-open 内置定时器 并发模式 重置密码 系统配置 PHP助手函数 sysconfig JS助手函数 checkMobile empty open 弹框 叠加loading getDataBrage getQueryVariable 扩展机制 事件扩展 实现事件 执行事件 事件列表 AdminLayoutRequireAfter LoadMigrationFiles AdminLoginIndex AdminLoginForget AdminLoginType AdminMenuTab AdminLayoutRequireBefore 自动更新 性能优化 精简代码 关闭数据库日志驱动 皮肤 正常 科幻 其他 切换模块时直接切换内容 关闭上传文件注入检测 代码编译原理 接入workerman和命令参数 升级TP6.1 Request的默认过滤 异步引入全局script 线上安装脚本 兼容PHP8.1
内置定时器

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

  • 运行方式
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

原文平台:奥宏文档

2.x