CakePHP2(2.3.10)で、cronを使って、コントローラー、アクションを実行する事があったので、忘備録としてポストします。
CakePHP2でcron実行
まずはこちらを読みましょう。大切なことは殆ど書かれています。
では、本題にはいります。
今回のミッションは、予定されているスケジュールに対し、前日の朝9時に起動する cron で「明日予定があるよ」という旨のアラートメールを送信するというもの。
cron は基本的に拡張子が .sh の shell(シェル)をキックして、起動させることで動作します。
そのシェルがCakePHPでは簡単に書くことができるので、非常に重宝しています。
コントローラー / アクション
CakePHP2ではシェルの中からコントローラー、アクションを使えるので、今回は
処理A:(1)レコードの抽出
処理B:(1)メール本文の作成、(2)メール送信する
という2種類のアクションを、コントローラー(AlertsController) に作成します。
app/Controller/AlertsController.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class AlertsController extends AppController { // 処理A public function select_record() { // (1)略しますが、スケジュールからレコードを抽出する、というアクションをここに記述 if (empty($schedule)) { return false; } return $schedule; } // 処理B public function send_alert_mail($schedule) { // (1)メール本文を作成 // (2)メールを送信 というアクションとします。 } } |
シェルの作成
では次に、cron がキックするシェルを作成します。
先ほど「シェルは拡張子が .shのファイル」と書きましたが、CakePHP2 の場合は AppShell を継承する CakePHP 形式の php ファイルで構いません。
app/Console/Command/AlertShell.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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); } |
と、以上のようなシェルファイルを作成。
$schedule が false の場合はログを書く仕様としていますが、無くてもよいかと思います。
この辺りは好みかと思います。
コマンドラインから起動
では、作成したものを動かしてみましょう。
サーバにアップロードし、ターミナルから以下のようにコマンドを打ち込みます。
|
1 |
/usr/local/bin/php /path/to/cakephp/app/Console/cake.php Alert day_before_confirm |
文法は
PHPまでのパス CakePHP2のConsole/cake.php シェル名(“Shell”は不要) アクション名
となります。
結果
|
1 2 3 4 5 |
Welcome to CakePHP v2.3.10 Console --------------------------------------------------------------- App : app Path: /path/to/cakephp/app/ --------------------------------------------------------------- |
このように表示され、成功していればメールが送信されているはずです。
cronジョブ化
最後に cron に登録してみます。
|
1 |
# crontab -e |
vi が起動するので、i キーを押下してインサートモードにします。
例として午前9時に起動する内容を記述します。
|
1 2 |
# alert mail (この行はコメントです) 00 09 * * * /usr/local/bin/php /path/to/cakephp/app/Console/cake.php Alert day_before_confirm |
Esc : w q とキーを押して、セーブします。
以上で登録完了です。
