CakePHP cron

【cron】CakePHP2.xのコントローラ/アクションをcronで実行する方法

2018/09/19

CakePHP2(2.3.10)で、cronを使って、コントローラー、アクションを実行する事があったので、忘備録としてポストします。

CakePHP2でcron実行

まずはこちらを読みましょう。大切なことは殆ど書かれています。

では、本題。
今回のミッションは、予定されているスケジュールに対して前日の朝9時に起動する cron で「明日予定があるよ」という旨のアラートメールを送信するというもの。

cron は基本的に拡張子が .sh の shell(シェル)をキックして、起動させます。
そのシェルの作り方ですが、これが意外と簡単にできてしまうのが CakePHP のいい所。

コントローラー / アクション

CakePHP2ではシェルの中からコントローラー、アクションを使えるので、

A.レコードの抽出
B.メール本文の作成、メール送信する

という2種類のアクションを、コントローラー(AlertsController) に作成します。

app/Controller/AlertsController.php

[php]
シェルの作成

では次に、cron がキックするシェルを作成します。
先ほど「シェルは拡張子が .shのファイル」と書きましたが、CakePHP2 の場合は AppShell を継承する CakePHP 形式の php ファイルで構いません。

app/Console/Command/AlertShell.php

[php]
AlertsController = new AlertsController();
}

public function day_before_confirm()
{
// (A)翌日が日程指定されているレコードを取得
$schedule = $this->AlertsController->select_record();
if ($schedule === false) {
$message = 'app/Command/AlertShell::day_before_confirm | "schedule"はありません'."\n";
$this->log($message); // ログ書き込み
return false;
}

// (B)メール本文作成、送信
$this->AlertsController->send_alert_mail($schedule);
}
[/php]

と、以上のようなシェルファイルを作成。
$schedule が false の場合はログを書く仕様としていますが、この辺りは好みかと思います。

コマンドラインから起動

では、作成したものを動かしてみましょう。
サーバにアップロードし、ターミナルから以下のようにコマンドを打ち込みます。

[default]
/usr/local/bin/php /path/to/cakephp/app/Console/cake.php Alert day_before_confirm
[/default]

文法は
-----
PHPまでのパス CakePHP2のConsole/cake.php シェル名("Shell"は不要) アクション名
-----
となります。

結果。

[default]
Welcome to CakePHP v2.3.10 Console
---------------------------------------------------------------
App : app
Path: /path/to/cakephp/app/
---------------------------------------------------------------
[/default]

このように表示され、成功していればメールが送信されているはずです。

cronジョブ化

最後に cron に登録してみます。

[default]
# crontab -e
[/default]

viが起動するので、[i]キーを押下してインサートモードに。
午前9時に起動させてみます。

[default]
#alert mail ←コメント
00 09 * * * /usr/local/bin/php /path/to/cakephp/app/Console/cake.php Alert day_before_confirm
[/default]

[Esc][:][w][q]とキーを押して、セーブ。
以上で登録完了です。

-CakePHP, cron
-, , ,