crontab 定期タスクコンポーネント
説明
workerman/crontab は Linux の crontab に似ていますが、秒単位のスケジューリングに対応しています。
時間の指定:
0 1 2 3 4 5
| | | | | |
| | | | | +------ day of week (0 - 6) (Sunday=0)
| | | | +------ month (1 - 12)
| | | +-------- day of month (1 - 31)
| | +---------- hour (0 - 23)
| +------------ min (0 - 59)
+-------------- sec (0-59)[省略可。0の桁がない場合、最小単位は分]
プロジェクト URL
https://github.com/walkor/crontab
インストール
composer require workerman/crontab
使用方法
ステップ1: プロセスファイル app/process/Task.php を作成
<?php
namespace app\process;
use Workerman\Crontab\Crontab;
class Task
{
public function onWorkerStart()
{
// 1秒ごとに実行
new Crontab('*/1 * * * * *', function(){
echo date('Y-m-d H:i:s')."\n";
});
// 5秒ごとに実行
new Crontab('*/5 * * * * *', function(){
echo date('Y-m-d H:i:s')."\n";
});
// 1分ごとに実行
new Crontab('0 */1 * * * *', function(){
echo date('Y-m-d H:i:s')."\n";
});
// 5分ごとに実行
new Crontab('0 */5 * * * *', function(){
echo date('Y-m-d H:i:s')."\n";
});
// 毎分の1秒目に実行
new Crontab('1 * * * * *', function(){
echo date('Y-m-d H:i:s')."\n";
});
// 毎日7時50分に実行(秒は省略)
new Crontab('50 7 * * *', function(){
echo date('Y-m-d H:i:s')."\n";
});
}
}
ステップ2: webman と同時にプロセスを起動するよう設定
設定ファイル config/process.php を開き、以下を追加:
return [
....その他の設定は省略....
'task' => [
'handler' => app\process\Task::class
],
];
ステップ3: webman を再起動
注意:定期タスクは即座には実行されません。次の分からカウントを開始し実行されます。
補足
crontab は非同期ではありません。例:1つの task プロセスに A と B の2つのタイマーを設定し、どちらも1秒ごとに実行する場合、タスク A に10秒かかると、B は A の完了を待つ必要があり、B の実行が遅れます。
時間間隔に敏感な処理の場合は、他のタスクの影響を受けないよう、時間に敏感な定期タスクを別プロセスで実行してください。例:config/process.php を次のように設定:
return [
....その他の設定は省略....
'task1' => [
'handler' => process\Task1::class
],
'task2' => [
'handler' => process\Task2::class
],
];
時間に敏感な定期タスクは process/Task1.php に、その他は process/Task2.php に配置してください。
config/process.php の詳細は カスタムプロセス を参照してください。