Asial Blog

Recruit! Asialで一緒に働きませんか?

CakePHP コントローラのメソッドをシェルで実行する方法

カテゴリ :
バックエンド(プログラミング)
タグ :
PHP
CakePHP
シェルスクリプト
サーバ
Cron
こんにちは高橋です。最近はドクターペッパーの謎の中毒性に苛まれています。

さて本題です。

シェルの作り方はすごく簡単で、AppShellクラスを継承するだけです。
今回は「TwitterのBotに定期的につぶやかせたい」といったケースを想定して作成していきます。

app/Controller/BotController.php
  1. <?php
  2. App::uses('AppController', 'Controller');
  3.  
  4. class BotController extends AppController
  5. {
  6.     public function tweet()
  7.     {
  8.         return $this->Bot->tweet(); //つぶやいた内容をreturnするメソッドとする
  9.     }
  10. }

app/Console/Command/BotShell.php
  1. <?php
  2.  
  3. App::uses('TwitterController', 'Controller');
  4.  
  5. class BotShell extends AppShell
  6. {
  7.  
  8.     public function startup()
  9.     {
  10.         parent::startup();
  11.         $this->TwitterController = new TwitterController();
  12.     }
  13.  
  14.     public function tweet()
  15.     {
  16.         $this->out($this->TwitterController->tweet());
  17.     }
  18.  
  19. }

準備はこれだけです。Botモデルの処理は省略させて頂きました。

これを動かしてみます。
  1. php ./app/Console/cake.php bot tweet
といっても、上記の一行を実行するだけです。

  1. php ./app/Console/cake.php bot tweet
  2. Welcome to CakePHP v2.3.9 Console
  3. ---------------------------------------------------------------
  4. App : app
  5. Path: /Users/yuya/Sites/test/rest/app/
  6. ---------------------------------------------------------------
  7. hello world.

しっかり「hello world.」が表示されていますね!

次は作成したシェルをCronのジョブに追加します。

  1. crontab -e

  1. #bot 
  2. 20,40 * * * * php /var/www/html/project/app/Console/cake.php bot tweet

これでCronが毎時20分と40分にコマンドを実行してくれることになります。

今回は単にメソッドを実行しただけですが、Cakeアプリの一部のため
例えばCakeLogやCakeEmailも簡単に追加できそうで便利だなぁと感じました。

詳しくは公式のドキュメントをご覧ください。
http://book.cakephp.org/2.0/ja/console-and-shells.html


---
余談となりますが、crontab -e はとーっても危険です。 crontab -r がジョブを削除するコマンド(お隣さん!)なので気を付けてください。個人のサーバですが、一度やらかして面倒なことになってしまいました。笑

・恐怖のcrontab -r. 設定ファイルはレポジトリ管理せよ
http://d.hatena.ne.jp/LukeSilvia/20080621/p1

それでは!