舊版(3.5.x版本之前)定時(shí)任務(wù)
開(kāi)發(fā)者執(zhí)行定時(shí)任務(wù)會(huì)通過(guò) Linux 的 Crontab
去實(shí)現(xiàn),不方便去管理。EasySwoole
提供了根據(jù) Linux
下 Crontab
規(guī)則的定時(shí)任務(wù),最小粒度為1分鐘。
創(chuàng)建一個(gè)定時(shí)任務(wù)
需要定義一個(gè)定時(shí)任務(wù)類(lèi)繼承 \EasySwoole\EasySwoole\Crontab\AbstractCronTask
。
定義執(zhí)行規(guī)則
public static function getRule(): string
{
// 定義執(zhí)行規(guī)則 根據(jù)Crontab來(lái)定義
return '*/1 * * * *';
}
定義 Crontab 名稱(chēng)
public static function getTaskName(): string
{
// 定時(shí)任務(wù)的名稱(chēng)
return 'custom crontab';
}
定義執(zhí)行邏輯
public function run(int $taskId, int $workerIndex)
{
// 定時(shí)任務(wù)的執(zhí)行邏輯
// 開(kāi)發(fā)者可投遞給task異步處理
TaskManager::getInstance()->async(function (){
// todo some thing
});
}
定義異常捕獲
public function onException(\Throwable $throwable, int $taskId, int $workerIndex)
{
// 捕獲run方法內(nèi)所拋出的異常
}
注冊(cè) Crontab
在 EasySwoole
框架全局的 mainServerCreate
事件(即項(xiàng)目根目錄的 EasySwooleEvent.php
文件)中進(jìn)行定時(shí)任務(wù)注冊(cè)
Crontab::getInstance()->addTask(CustomCrontab::class);
完整示例代碼
<?php
namespace App\Crontab;
use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
use EasySwoole\EasySwoole\Task\TaskManager;
class CustomCrontab extends AbstractCronTask
{
public static function getRule(): string
{
// 定義執(zhí)行規(guī)則 根據(jù)Crontab來(lái)定義
return '*/1 * * * *';
}
public static function getTaskName(): string
{
// 定時(shí)任務(wù)的名稱(chēng)
return 'CustomCrontab';
}
public function run(int $taskId, int $workerIndex)
{
// 定時(shí)任務(wù)的執(zhí)行邏輯
// 例如:每隔1分鐘打印當(dāng)前時(shí)間
echo date('Y-m-d H:i:s') . PHP_EOL;
}
public function onException(\Throwable $throwable, int $taskId, int $workerIndex)
{
// 捕獲run方法內(nèi)所拋出的異常
}
}
Crontab表達(dá)式
通用表達(dá)式:
* * * * *
- - - - -
| | | | |
| | | | |
| | | | +----- day of week (0 - 7) (Sunday=0 or 7)
| | | +---------- month (1 - 12)
| | +--------------- day of month (1 - 31)
| +-------------------- hour (0 - 23)
+------------------------- min (0 - 59)
特殊表達(dá)式:
@yearly 每年一次 等同于(0 0 1 1 *)
@annually 每年一次 等同于(0 0 1 1 *)
@monthly 每月一次 等同于(0 0 1 * *)
@weekly 每周一次 等同于(0 0 * * 0)
@daily 每日一次 等同于(0 0 * * *)
@hourly 每小時(shí)一次 等同于(0 * * * *)
Crontab 管理
EasySwoole
內(nèi)置對(duì)于 Crontab
的命令行操作,方便開(kāi)發(fā)者友好的去管理 Crontab
。
可執(zhí)行 php easyswoole.php crontab -h
來(lái)查看具體操作。
查看所有注冊(cè)的Crontab
php easyswoole.php crontab show
停止指定的Crontab
php easyswoole.php crontab stop --name=TASK_NAME
恢復(fù)指定的Crontab
php easyswoole.php crontab resume --name=TASK_NAME
立即跑一次指定的Crontab
php easyswoole.php crontab run --name=TASK_NAME
版本強(qiáng)調(diào)
EasySwoole 3.3.0
版本如何定義:
<?php
namespace App\Crontab;
use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
class TaskOne extends AbstractCronTask
{
public static function getRule(): string
{
// TODO: Implement getRule() method.
// 定時(shí)周期 (每小時(shí))
return '@hourly';
}
public static function getTaskName(): string
{
// TODO: Implement getTaskName() method.
// 定時(shí)任務(wù)名稱(chēng)
return 'taskOne';
}
static function run(\swoole_server $server, int $taskId, int $fromWorkerId,$flags=null)
{
// TODO: Implement run() method.
// 定時(shí)任務(wù)處理邏輯
var_dump('run once per hour');
}
}