官方文檔:https://hyperf.wiki/2.1/#/zh-cn/crontab
定義方法:1、注解定義
2、配置文件定義
特色:提供了秒級定時任務功能
任務屬性:
1、name => 定時任務名稱
2、rule => 定時任務規則
3、callback => 定時任務回調
4、memo => 定時任務備注
5、enable => 是否生效
配置要求:
1、安裝組件 composer require hyperf/crontab
2、啟動任務調度進程
2.1、在config/autoload/processes.php 下注冊
<?php // config/autoload/processes.php return [ Hyperf\Crontab\Process\CrontabDispatcherProcess::class, ];
2.2、在config/autoload/crontab.php 下配置
<?php return [ // 是否開啟定時任務 'enable' => true, ];
注解定義:
<?php namespace App\Task; use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Crontab\Annotation\Crontab; use Hyperf\Di\Annotation\Inject; /** * @Crontab(name="Foo", rule="* * * * *", callback="execute", memo="這是一個示例的定時任務") */ class FooTask { /** * @Inject() * @var \Hyperf\Contract\StdoutLoggerInterface */ private $logger; public function execute() { $this->logger->info(date('Y-m-d H:i:s', time())); } /** * @Crontab(rule="* * * * * *", memo="foo") */ public function foo() { var_dump('foo'); } }
配置文件定義:
在 config/autoload/crontab.php 配置定時任務
<?php // config/autoload/crontab.php use Hyperf\Crontab\Crontab; return [ 'enable' => true, // 通過配置文件定義的定時任務 'crontab' => [ // Callback類型定時任務(默認) (new Crontab())->setName('Foo')->setRule('30 8 * * *')->setCallback([App\Task\FooTask::class, 'execute'])->setMemo('這是一個示例的定時任務'), ];
注意點:singleton解決任務的並發執行問題,任務永遠只會同時運行 1 個。但是這個沒法保障任務在集群時重復執行的問題。
問題:假如有多個節點同時請求這個定時任務
方案:redis鎖
第一個請求的節點存固定數據,並設置過期時間,其他節點請求時判斷存的數據是否存在,存在則跳過
例如:
$redis = make(RedisService::class); if ($redis->exists('key')) return null; $redis->set('key', 1, 60);
