Cronの設定って下記の問題点があるかと思います
- 設定が無駄に多い
- 決まった時間に動作するバッチが多くてメモリを圧迫する
- dateパラメータを記載するときに%をエスケープ忘れてコケる
- crontab -e しようとして crontab -r して設定全消し
などなど
fuel-runtasksというPackageを作成しました
概要
RunTasksはcrontabなどに設定してあるFuelPHPのtasksを一元管理するために作成しました
ただしパイプなどで別に渡してしまい場合には不向きかもしれません
実用例としては
- 毎時にAを実行してからBを実行したい場合など順次に実行する場合
- 毎時に実行する C, D, E をcrontabなどに3行書いてしまっている場合
- グルーピングをして毎時や毎月実行させる場合
しかしながら、設定した内容を順次に実行していくため注意が必要です
例) 毎時、毎月に1回実行させているものを纏める
crontab -l
#hourly
0 */1 * * * env FUEL_ENV=production php oil refine task1
0 */1 * * * env FUEL_ENV=production php oil refine task2:foo
0 */1 * * * env FUEL_ENV=production php oil refine task3:bar "`date -d '1 hours ago' '+\%F \%H:00:00'`" "`date -d '1 hours ago' '+\%F \%H:59:59'`"
#daily
0 1 * * * env FUEL_ENV=production php oil refine tasks4
0 1 * * * env FUEL_ENV=production php oil refine tasks5:hoge
0 1 * * * env FUEL_ENV=production php oil refine tasks6:moge "`date -d '1 days ago' '+\%F 00:00:00'`" "`date -d '1 days ago' '+\%F 23:59:59'`"
これを RunTasksを使用することで下記となります
0 */1 * * * env FUEL_ENV=production php runtasks hourly
0 0 * * * env FUEL_ENV=production php runtasks daily
設定内容は下記となります
---
groups
hourly:
- task1
- task2:foo
- task3:bar "`date -d '1 hours ago' '+%F %H:00:00'`" "`date -d '1 hours ago' '+%F %H:59:59'`"
daily:
- tasks4
- tasks5:hoge
- tasks6:moge "`date -d '1 days ago' '+%F 00:00:00'`" "`date -d '1 days ago' '+%F 23:59:59'`"
インストール方法
2通り紹介します
■ oilコマンドでインストールする場合
fuel/app/config/package.php がない場合は fuel/core/config/package.php を
fuel/app/config/package.php にコピーしてきます
次にfuel/app/config/package.php に github.com/dimgraycat を追加します
'sources' => array(
'github.com/fuel-packages',
'github.com/dimgraycat', // 追加
),
後はDOCROOTで
$ php oil package install runtasks
■ git submodule add でインストールする場合
DOCROOTで実行します
$ git submodule add git@github.com:dimgraycat/fuel-runtasks.git fuel/packages/fuel-runtasks
$ cd fuel/packages/fuel-runtasks
$ git submodule init
$ git submodule update
使い方
使い方は3通り
■ 直接使う
$ php fuel/packages/fuel-runtasks/bin/runtasks <group> [<options>]
■ DOCROOTにシンボリックリンクを貼るか、コピーして使う
コピーして使う場合
$ cp fuel/packages/fuel-runtasks/bin/runtasks runtasks
シンボリックリンクを貼る
$ ln -s fuel/packages/fuel-runtasks/bin/runtasks runtasks
使う
php runtasks <group> [<options>]
■ oilコマンドから呼び出して使う
app/config/config.phpにてパッケージを読み込み
...
always_load => array(
'packages' => array(
// 'orm',
'fuel-runtasks', // 追加
),
),
...
使う
php oil refine runtasks <group> [<options>]
RunTasksの設定方法
■ 前準備
注意事項
デフォルト設定でphpファイルではなくyamlファイルのruntasks.ymlをConfig::loadします
runtasks.ymlをコピーしてきます
$ cp fuel/packages/fuel-runtasks/config/runtasks.yml fuel/app/config/
$ mkdir fuel/app/config/runtasks
環境別で設定を分けたい場合は従来の設定通りになります
■ 環境別で使用する場合
通常のoilで使う方法と何も変わりません
$ env FUEL_ENV=[Fuel::$env] refine runtasks <group> [<options>]
FuelPHPの環境別実行は
fuel/packages/fuel-runtasks/config/runtasks.ymlを読み込んでから各環境別の設定をオーバーライドします
fuel/packages/fuel-runtasks/config/runtasks.yml
↓
fuel/packages/fuel-runtasks/config/[Fuel::$env]/runtasks.yml
■ 設定説明
runtasks.ymlの中身
---
default:
php_path: /path/to/php
include_dir: runtasks
is_logging: false
is_stdout: true
is_continue: true
prefix_message: '[RunTasks_Runner::run]'
php_ini:
memory_limit: '128M'
time_limit: 30
groups:
group1: []
- default
- php_path: phpのパスを設定します
- /usr/bin/php など
- include_dir: 別ファイルを読み込むディレクトリ
- is_logging: \Log::$method での出力をするかどうかをbooleanで設定します
- is_stdout: コマンドラインから実行時にSTDOUTするかどうかをbooleanで設定します
- trueの時、STDERRも出力されます
- is_continue: trueの場合groupsで設定したtasksが途中で失敗した場合でも次のtaskを実行します
- prefix_message: is_loggingがtrueの時に出力される内容の接頭に設定した内容が付加されます
- 不要の場合は ''にするかprefix_messageの行を削除してください
- php_path: phpのパスを設定します
- php_ini
- memory_limit: runtasksに割り当てるメモリ量の最大値
- time_limit: phpの[set_time_limit]に設定する値
- groups: ここに実行させたいtasksを設定してください
- fuel/packages/fuel-runtasks/config/example.ymlを参照してください
■ shellコマンドなどを使う
---
groups:
hourly:
- cmd: php -r 'echo "run task!;'
oilで実行したいコマンド以外にもshellで実行出来るようになっています
もし明示的にshellコマンドなのかoilなのかを分けたい場合は下記の様に設定することができます
---
groups:
hourly:
- cmd: php -r 'echo "run task!";'
- oil: task3:bar "`date -d '1 hours ago' '+%F %H:00:00'`" "`date -d '1 hours ago' '+%F %H:59:59'`"
■ runtasksのtasks(groups)の設定を外部の設定から読み込む
初期設定ではruntasksのフォルダになります。
fuel/app/config/runtasks/*
fuel/app/config/[Fuel::$env]/runtasks/*
設定方法は下記を参照してください
config/runtasks.yml
---
default:
php_path: /path/to/php
include_dir: runtasks
is_logging: false
is_stdout: true
is_continue: true
prefix_message: '[RunTasks_Runner::run]'
php_ini:
memory_limit: '128M'
time_limit: 30
groups:
hourly:
- task1
- task2:foo
- task3:bar "`date -d '1 hours ago' '+%F %H:00:00'`" "`date -d '1 hours ago' '+%F %H:59:59'`"
+daily: 'daily.yml'
+monthly: 'monthly'
group名の前にprefixとして+を付けるとinclude_dir内へ設定を読み込みに行きます
例:
上記から+daily: 'daily.yml'の場合
config/runtasks/daily.ymlを読み込みます
---
daily:
- dailytask1
- dailytask1:foo
- dailytask1:bar "`date -d '1 hours ago' '+%F %H:00:00'`" "`date -d '1 hours ago' '+%F %H:59:59'`"
■ optionsについて
一時的にLogに出力したい場合や、STDOUTで出力したい場合などにオプションを付けることができます
オプションが設定されていない場合はconfigの値が使われます
$ php runtasks <group> --logging --stdout