FuelPHPでCron設定を管理するPackage

Cronの設定って下記の問題点があるかと思います

* 設定が無駄に多い
* 決まった時間に動作するバッチが多くてメモリを圧迫する
* dateパラメータを記載するときに%をエスケープ忘れてコケる
* crontab -e しようとして crontab -r して設定全消し

などなど

# fuel-runtasksというPackageを作成しました

https://github.com/dimgraycat/fuel-runtasks

## 概要

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
```

設定内容は下記となります

```lang:yaml
---
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'`"
```
- - - -

## インストール方法

２通り紹介します

### ■ oilコマンドでインストールする場合

fuel/app/config/package.php がない場合は fuel/core/config/package.php を
fuel/app/config/package.php にコピーしてきます
次にfuel/app/config/package.php に **github.com/dimgraycat** を追加します

```lang:php
'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にてパッケージを読み込み

```lang: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の中身

```lang:yaml
---
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_ini
 * memory_limit: runtasksに割り当てるメモリ量の最大値
 * time_limit: phpの[set_time_limit]に設定する値
* groups: ここに実行させたいtasksを設定してください
 * fuel/packages/fuel-runtasks/config/example.ymlを参照してください

### ■ shellコマンドなどを使う

```lang:yaml
---
groups:
  hourly:
    - cmd: php -r 'echo "run task!;'
```

oilで実行したいコマンド以外にもshellで実行出来るようになっています
もし明示的にshellコマンドなのかoilなのかを分けたい場合は下記の様に設定することができます

```lang:yaml
---
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

```lang:yaml
---
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を読み込みます

```lang:yaml
---
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
```