lavary/crunzを使って、PHPでタスク管理してみた。
できること
タスク管理は、crontabやcron.dでシェルやファイル毎に時間の指定をすることが多いと思うが、その管理をPHPで制御できるようにする。
メリット
PHPファイルの中でタスク管理が可能
デプロイ時が楽
デメリット
日本語の文献が少ない
大元のphpファイルだけはcronの設定が必要
準備
①ライブラリをcomposerでインストール
インストールしたいアプリケーションディレクトリ上で以下のコマンド。
composerがインストールされていなければ入れる必要がある。
composer require lavary/crunz
成功すると、vendor/binフォルダの中に「crunz」ファイルが作成されます。
※CakePHP3での動作は確認済み
②大元のタスク管理ファイルをphpで作成
ディレクトリの場所は問わないが、ファイル名を必ず「〇〇Tasks.php」とすること
例:
・DefaultTasks.php
・TestTasks.php
・SimpleTasks.php
など。
③大元のタスク管理ファイルの中でlavary/crunzを呼び出す。
use Crunz\Schedule;
④大元のタスク管理ファイルの中にタスクを書く。
<?php
use Crunz\Schedule;
$schedule = new Schedule();
$task = $schedule->run('mv /var/www/html/test.php /var/log/test.php');
$task->daily();
return $schedule;
以上のサンプルは、1日毎にtest.phpを移動させるスクリプトになります。
$schedule->run('')
()内に、linuxのコマンドをそのまま書くことができます。
$task->daily();
以上は1日毎に実行という意味です。
実行のパターン
①毎日10時に実行
$task->dailyAt('10:00');
②毎分実行
$task->everyMinute();
③毎週月曜日の5時に実行
$task->mondays()->at('5:00');
④毎分10分毎に実行
$task->everyTenMinute();
⑤月の初めの9時に実行
$task->monthly()->at('9:00')
※もっとパターンがあります。詳しくはgithubを参照ください。
https://github.com/lavary/crunz
複数タスクも勿論可能
<?php
use Crunz\Schedule;
$schedule = new Schedule();
$task = $schedule->run('mv /var/www/html/test.php /var/log/test.php');
$task->daily();
$task = $schedule->run('cp test.php{,.20191010}');
$task->mondays()->at('19:00');
//CakePHP3のシェルも、もちろん可能!!
$task = $schedule->run('bin/cake TestShell');
$task->everyMinute();
return $schedule;
⑤大元のタスク管理ファイルをcronに置く
タイトルにcronはもはや不要!?と書いたのですが、実際は結局必要なのです。
大元のタスク管理ファイルを、cronで毎分(毎秒)実行させることによって、
phpで設定した実行コマンドをタスクとしてそれぞれ実行するのです。
linux CentOS7で動作確認してます。
cron.dに移動
cd /etc/cron.d/
cron.d内にsampleタスクを作成
vi sample
毎分に実行するタスクを書く(実行者はサンプルではroot)
* * * * * root vendor/bin/crunz schedule:run
schedule:runを呼び出すことによって、
先に作ったDefaultTasks.phpを呼ぶ形になるのです。
これでタスクは設定どおりに呼び出されます。
おまけ
タスク管理ファイルはphpなので勿論、以下のような使い方も可能です。
<?php
use Crunz\Schedule;
$environment = 'local'; // or production
$date = date("YmdHis");
$schedule = new Schedule();
//ファイル名をPHPで生成
$task = $schedule->run('mv /var/www/html/test.php /var/log/'.$date.'.php');
$task->daily();
//if文の利用
if($environment == 'local'){
$task = $schedule->run('mv /var/www/html/test.php /var/log/test.php');
$task->daily();
}
return $schedule;
等々