定時(shí)任務(wù)
開發(fā)者執(zhí)行定時(shí)任務(wù)會(huì)通過 Linux 的 Crontab
去實(shí)現(xiàn),不方便去管理。EasySwoole
提供了根據(jù) Linux
下 Crontab
規(guī)則的定時(shí)任務(wù),最小粒度為1分鐘。
注意:舊版本(3.5.x 之前版本)的定時(shí)任務(wù)的使用請(qǐng)查看 舊版本(3.5.x之前)定時(shí)任務(wù)
創(chuàng)建一個(gè)定時(shí)任務(wù)
需要定義一個(gè)定時(shí)任務(wù)類實(shí)現(xiàn) \EasySwoole\Crontab\JobInterface
接口。
定義執(zhí)行規(guī)則
public function crontabRule(): string
{
// 定義執(zhí)行規(guī)則 根據(jù)Crontab來定義
return '*/1 * * * *';
}
定義 Crontab 名稱
public function jobName(): string
{
// 定時(shí)任務(wù)的名稱
return 'CustomCrontab';
}
定義執(zhí)行邏輯
public function run()
{
// 定時(shí)任務(wù)的執(zhí)行邏輯
// 開發(fā)者可投遞給task異步處理
TaskManager::getInstance()->async(function (){
// todo some thing
});
}
定義異常捕獲
public function onException(\Throwable $throwable)
{
// 捕獲run方法內(nèi)所拋出的異常
}
注冊(cè) Crontab
在 EasySwoole
框架全局的 mainServerCreate
事件(即項(xiàng)目根目錄的 EasySwooleEvent.php
文件的 mainServerCreate
方法中)中進(jìn)行定時(shí)任務(wù)注冊(cè)。
public static function mainServerCreate(EventRegister $register)
{
// 配置定時(shí)任務(wù)
$crontabConfig = new \EasySwoole\Crontab\Config();
// 1.設(shè)置執(zhí)行定時(shí)任務(wù)的 socket 服務(wù)的 socket 文件存放的位置,默認(rèn)值為 當(dāng)前文件所在目錄
// 這里設(shè)置為框架的 Temp 目錄
$crontabConfig->setTempDir(EASYSWOOLE_TEMP_DIR);
// 2.設(shè)置執(zhí)行定時(shí)任務(wù)的 socket 服務(wù)的名稱,默認(rèn)值為 'EasySwoole'
$crontabConfig->setServerName('EasySwoole');
// 3.設(shè)置用來執(zhí)行定時(shí)任務(wù)的 worker 進(jìn)程數(shù),默認(rèn)值為 3
$crontabConfig->setWorkerNum(3);
// 4.設(shè)置定時(shí)任務(wù)執(zhí)行出現(xiàn)異常的異常捕獲回調(diào)
$crontabConfig->setOnException(function (\Throwable $throwable) {
// 定時(shí)任務(wù)執(zhí)行發(fā)生異常時(shí)觸發(fā)(如果未在定時(shí)任務(wù)類的 onException 中進(jìn)行捕獲異常則會(huì)觸發(fā)此異常回調(diào))
});
// 創(chuàng)建定時(shí)任務(wù)實(shí)例
$crontab = \EasySwoole\EasySwoole\Crontab\Crontab::getInstance($crontabConfig);
// 注冊(cè)定時(shí)任務(wù)
$crontab->register(new \App\Crontab\CustomCrontab());
}
完整使用示例代碼
在 EasySwoole 中使用
1.定義定時(shí)任務(wù)類,新增 \App\Crontab\CustomCrontab
文件,文件內(nèi)容如下:
<?php
namespace App\Crontab;
use EasySwoole\Crontab\JobInterface;
class CustomCrontab implements JobInterface
{
public function jobName(): string
{
// 定時(shí)任務(wù)的名稱
return 'CustomCrontab';
}
public function crontabRule(): string
{
// 定義執(zhí)行規(guī)則 根據(jù) Crontab 來定義
// 這里是每分鐘執(zhí)行 1 次
return '*/1 * * * *';
}
public function run()
{
// 定時(shí)任務(wù)的執(zhí)行邏輯
// 相當(dāng)于每分鐘打印1次時(shí)間戳,這里只是參考示例。
echo time();
}
public function onException(\Throwable $throwable)
{
// 捕獲 run 方法內(nèi)所拋出的異常
}
}
2.注冊(cè)定時(shí)任務(wù),在 EasySwoole
框架全局的 mainServerCreate
事件(即項(xiàng)目根目錄的 EasySwooleEvent.php
文件的 mainServerCreate
方法中)中進(jìn)行定時(shí)任務(wù)注冊(cè),如下所示:
<?php
namespace EasySwoole\EasySwoole;
use App\Crontab\CustomCrontab;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\EasySwoole\Crontab\Crontab;
class EasySwooleEvent implements Event
{
public static function initialize()
{
date_default_timezone_set('Asia/Shanghai');
}
public static function mainServerCreate(EventRegister $register)
{
###### 注冊(cè)一個(gè)定時(shí)任務(wù) ######
// 配置定時(shí)任務(wù)
$crontabConfig = new \EasySwoole\Crontab\Config();
// 1.設(shè)置執(zhí)行定時(shí)任務(wù)的 socket 服務(wù)的 socket 文件存放的位置,默認(rèn)值為 當(dāng)前文件所在目錄
// 這里設(shè)置為框架的 Temp 目錄
$crontabConfig->setTempDir(EASYSWOOLE_TEMP_DIR);
// 2.設(shè)置執(zhí)行定時(shí)任務(wù)的 socket 服務(wù)的名稱,默認(rèn)值為 'EasySwoole'
$crontabConfig->setServerName('EasySwoole');
// 3.設(shè)置用來執(zhí)行定時(shí)任務(wù)的 worker 進(jìn)程數(shù),默認(rèn)值為 3
$crontabConfig->setWorkerNum(3);
// 4.設(shè)置定時(shí)任務(wù)執(zhí)行出現(xiàn)異常的異常捕獲回調(diào)
$crontabConfig->setOnException(function (\Throwable $throwable) {
// 定時(shí)任務(wù)執(zhí)行發(fā)生異常時(shí)觸發(fā)(如果未在定時(shí)任務(wù)類的 onException 中進(jìn)行捕獲異常則會(huì)觸發(fā)此異常回調(diào))
});
// 創(chuàng)建定時(shí)任務(wù)實(shí)例
$crontab = \EasySwoole\EasySwoole\Crontab\Crontab::getInstance($crontabConfig);
// 注冊(cè)定時(shí)任務(wù)
$crontab->register(new CustomCrontab());
}
}
在 Swoole 中使用
<?php
use EasySwoole\Crontab\JobInterface;
require_once __DIR__ . '/vendor/autoload.php';
$http = new Swoole\Http\Server('0.0.0.0', 9501);
class JobPerMin implements JobInterface
{
public function jobName(): string
{
return 'JobPerMin';
}
public function crontabRule(): string
{
return '*/1 * * * *';
}
public function run()
{
var_dump(time());
return time();
}
public function onException(\Throwable $throwable)
{
throw $throwable;
}
}
// 配置及注冊(cè)定時(shí)任務(wù)
$crontab = \EasySwoole\EasySwoole\Crontab\Crontab::getInstance();
$crontab->register(new JobPerMin());
$crontab->attachToServer($http);
$http->on('request', function ($request, $response) use ($crontab) {
// 在 http 服務(wù)中直接觸發(fā)執(zhí)行定時(shí)任務(wù)
$ret = $crontab->rightNow('JobPerMin');
$response->header('Content-Type', 'text/plain');
$response->end('Hello World ' . $ret);
});
$http->start();
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 * * * *)