crontab定時タスクコンポーネント

workerman/crontab

説明

workerman/crontabは、Linuxのcrontabに似ていますが、workerman/crontabは秒単位のタイミングをサポートしています。

時間の指定:

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ 曜日 (0 - 6) (日曜日=0)
|   |   |   |   +------ 月 (1 - 12)
|   |   |   +-------- 月の日 (1 - 31)
|   |   +---------- 時 (0 - 23)
|   +------------ 分 (0 - 59)
+-------------- 秒 (0-59) [省略可能、0位がない場合、最小の時間単位は分]

プロジェクトのリンク

https://github.com/walkor/crontab

インストール

composer require workerman/crontab

使用法

ステップ1: プロセスファイル process/Task.php の作成

<?php
namespace 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'  => 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の詳細な設定については、カスタムプロセスを参照してください。