安装
sudo composer require hyperf/crontab
使用
启动任务调度器进程
在使用定时任务组件之前,需要先在 config/autoload/processes.php
内注册一下 Hyperf\Crontab\Process\CrontabDispatcherProcess
自定义进程,如下:
<?php
// config/autoload/processes.php
return [
Hyperf\Crontab\Process\CrontabDispatcherProcess::class,
];
这样服务启动时会启动一个自定义进程,用于对定时任务的解析和调度分发。
同时,您还需要将 config/autoload/crontab.php
内的 enable
配置设置为 true
,表示开启定时任务功能,如配置文件不存在可自行创建,配置如下:
<?php
return [
// 是否开启定时任务
'enable' => true,
];
通过配置文件定义
您可于 config/autoload/crontab.php 的配置文件内配置您所有的定时任务,文件返回一个 Hyperf\Crontab\Crontab[] 结构的数组,如配置文件不存在可自行创建:
<?php
use Hyperf\Crontab\Crontab;
return [
// 是否开启定时任务
'enable' => true,
// 通过配置文件定义的定时任务
'crontab' => [
(new Crontab())->setName('CancelTakeOrder')->setRule('* * * * *')->setCallback([App\Task\CancelTakeOrderTask::class, 'execute'])->setMemo('30分钟后未支付自动取消支付'),
],
];
通过注解定义
通过 @Crontab 注解可以快速完成对一个任务的定义,以下的定义示例与配置文件定义所达到的目的都是一样的。定义一个名为 Foo 每分钟执行一次 App\Task\FooTask::execute() 的定时任务。
<?php
namespace App\Task;
use App\Services\TakeOrderService;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Logger\LoggerFactory;
/**
* @Crontab(name="CancelTakeOrder", rule="* * * * *", callback="execute", memo="30分钟后未支付自动取消支付")
* Class CancelTakeOrder
* @author liutao5@realcan.cn
* @version 1.0
* @package App\Task
*/
class CancelTakeOrderTask
{
private $logger;
/**
* @Inject
* @var TakeOrderService
*/
private $takeOrderService;
public function __construct( LoggerFactory $loggerFactory )
{
$this->logger = $loggerFactory->get('log', 'handle');
}
public function execute()
{
$res = $this->takeOrderService->failure();
if($res === false) {
$this->logger->info(' - 系统自动取消30分钟后未支付订单 执行失败');
}
$this->logger->info(' - 系统自动取消30分钟后未支付订单 执行成功 影响行数:' . $res);
}
}
任务属性
name
定时任务的名称,可以为任意字符串,各个定时任务之间的名称要唯一。
rule
定时任务的执行规则,在分钟级的定义时,与 Linux 的 crontab 命令的规则一致,在秒级的定义时,规则长度从 5 位变成 6 位,在规则的前面增加了对应秒级的节点,也就是 5 位时以分钟级规则执行,6 位时以秒级规则执行,如 */5 * * * * * 则代表每 5 秒执行一次。注意在注解定义时,规则存在 \ 符号时,需要进行转义处理,即填写 *\/5 * * * * *。
callback
定时任务的执行回调,即定时任务实际执行的代码,在通过配置文件定义时,这里需要传递一个 [$class, $method] 的数组,$class 为一个类的全称,$method 为 $class 内的一个 public 方法。当通过注解定义时,只需要提供一个当前类内的 public 方法的方法名即可,如果当前类只有一个 public 方法,您甚至可以不提供该属性。
singleton
解决任务的并发执行问题,任务永远只会同时运行 1 个。但是这个没法保障任务在集群时重复执行的问题。
onOneServer
多实例部署项目时,则只有一个实例会被触发。
mutexPool
互斥锁使用的 Redis 连接池。
mutexExpires
互斥锁超时时间,如果定时任务执行完毕,但解除互斥锁失败时,互斥锁也会在这个时间之后自动解除。
memo
定时任务的备注,该属性为可选属性,没有任何逻辑上的意义,仅供开发人员查阅帮助对该定时任务的理解。
enable
当前任务是否生效。
运行定时任务
当您完成上述的配置后,以及定义了定时任务后,只需要直接启动 Server,定时任务便会一同启动。
在您启动后,即便您定义了足够短周期的定时任务,定时任务也不会马上开始执行,所有定时任务都会等到下一个分钟周期时才会开始执行,比如您启动的时候是 10 时 11 分 12 秒,那么定时任务会在 10 时 12 分 00 秒 才会正式开始执行。