CakePHP2(2.3.10)で、cronを使って、コントローラー、アクションを実行する事があったので、忘備録としてポストします。
CakePHP2でcron実行
まずはこちらを読みましょう。大切なことは殆ど書かれています。
では、本題。
今回のミッションは、予定されているスケジュールに対して前日の朝9時に起動する cron で「明日予定があるよ」という旨のアラートメールを送信するというもの。
cron は基本的に拡張子が .sh の shell(シェル)をキックして、起動させます。
そのシェルの作り方ですが、これが意外と簡単にできてしまうのが CakePHP のいい所。
コントローラー / アクション
CakePHP2ではシェルの中からコントローラー、アクションを使えるので、
A.レコードの抽出
B.メール本文の作成、メール送信する
という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 | <?php class AlertsController extends AppController {     // (A)     public function select_record()     {         // 略しますが、スケジュールからレコードを抽出する、というアクションをここに記述         if (empty($schedule)) {             return false;         }         return $schedule;     }     // (B)     public function send_alert_mail($schedule)     {         // メール本文を作成         // メールを送信     というアクションとします。     } } | 
シェルの作成
では次に、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 16 17 18 19 20 21 22 23 24 25 26 | <?php App::uses('AlertsController', 'Controller'); class AlertShell extends AppShell {     function startup()     {         parent::startup();         // コントローラー設定         $this->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);     } | 
と、以上のようなシェルファイルを作成。
$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]とキーを押して、セーブ。
以上で登録完了です。

 
         
         
         
         
         
         
         
         
         
         
         
         
         
        