Skip to content

计划任务开发

计划任务概述

过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通过 SSH 远程登录到服务器上去操作,使用起来不是很方便。
现在你可以通过项目内置的任务调度器在项目中清晰明了地实现计划任务。

插件计划任务开发

定义计划任务模板

文件位置:niucloud\addon\shop\app\dict\schedule\schedule.php 关键代码:

php
<?php

return [
    [
        'key' => 'shop_order_close',     //任务模板标识,必须是唯一的
        'name' => '未支付订单自动关闭',    //任务模板名称
        'desc' => '',                    //任务介绍
        'time' => [                      //任务调度频率间隔
            'type' => 'min',             //任务调度频率类型
            'min' => 1                   //任务调度频率间隔
        ],
        'class' => 'addon\shop\app\job\order\OrderClose', //任务消费层所在类的路径,类名为当前任务key值下划线转驼峰的类。例如当前任务key值为shop_order_close,任务消费类的位置就为niucloud\addon\shop\app\job\order\OrderClose.php,类名为OrderClose
        'function' => '',                //任务调用方法:如果为空的话会默认调用doJob方法。如果不为空的话会在class类内部直接调用当前方法
    ]
];

type任务调度频率类型:

type(任务的调度频率)示例说明
minmin为1表示每分钟运行一次任务
hourhour为1 min为1表示每隔一小时的第几分钟运行一次任务
dayday为1 hour为1 min为1表示每隔一日的1时1分运行一次任务
weekweek为1 hour为1 min为1表示每周周一的1时1分运行一次任务
monthday为1 hour为1 min为1表示每月一号的1时1分运行一次任务

编写具体的计划任务逻辑代码

文件位置:niucloud\addon\shop\app\job

框架计划任务开发

框架计划任务开发和插件计划任务开发类似

定义任务模板及任务类

在 niucloud\app\dict\schedule\schedule.php 类中新增任务项

任务模板class值(任务消费类的位置)和function(方法名)

任务消费类所在位置,默认可以为空,如果为空的话会自动在niucloud\app\job\schedule\路径下寻找当前任务key值下划线转驼峰的类,如果类不存在,就在niucloud\app\job\schedule\路径下创建一个对应类

class值不为空的话,会直接通过class路径去直接寻找任务类

function值如果为空值的话会默认调用doJob方法,function值如果不为空值的话会在class类内部直接调用

添加计划任务

任务添加到模板之后,这时候任务还不能使用,还需要将任务模板写入到数据库中:

后台点击开发->计划任务->添加任务 选择任务模板 设置任务周期和是否启用 点击确定即可成功添加计划任务

运行计划任务

直接在终端运行命令

如果只是临时测试或手动运行计划任务,可以直接在终端执行以下命令:

bash
php think cron:schedule

这个命令会立即启动计划任务调度器,开始执行已定义的计划任务

结合系统计划任务

结合项目所在服务器系统的计划任务来使用

bash
* * * * * cd /您的项目路径 && php think cron:run >> /dev/null 2>&1

说明:
- `* * * * *` 表示每分钟执行一次

- `cd /您的项目路径` 切换到项目根目录
- `php think cron:run` 执行项目的计划任务
- `>> /dev/null 2>&1` 将输出重定向到空设备,避免生成大量日志文件

使用Supervisor保持常驻进程

调试完毕后,为了确保计划任务调度器能够持续运行而不会因系统重启或其他原因中断,推荐使用Supervisor来管理进程:

Supervisor配置示例:

[program:cron-schedule]
command=php think cron:schedule  # 要执行的命令
directory=/www/wwwroot/您的项目路径/  # 项目目录
user=www  # 执行用户
priority=999  # 优先级
numprocs=1  # 进程数量

配合宝塔使用

如果你使用宝塔面板,可以在面板中添加守护进程:

登录宝塔面板->进入「软件商店」->安装「Supervisor管理器」->点击「添加守护进程」->填写进程名称、执行目录和启动命令->启动命令填写:php think cron:schedule->保存并启动

注意事项

修改计划任务参数后,必须重启workerman才能使新配置生效

重启方法:

  1. 停止现有进程:php think worker:stop

  2. 重新启动:php think worker:start

基于 MIT 协议发布