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

こんにちは高橋です。最近はドクターペッパーの謎の中毒性に苛まれています。

さて本題です。

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

app/Controller/BotController.php


<?php
App::uses('AppController', 'Controller');
class BotController extends AppController
{
    public function tweet()
    {
        return $this->Bot->tweet(); //つぶやいた内容をreturnするメソッドとする
    }
}

app/Console/Command/BotShell.php


<?php
App::uses('TwitterController', 'Controller');
class BotShell extends AppShell
{
    public function startup()
    {
        parent::startup();
        $this->TwitterController = new TwitterController();
    }
    public function tweet()
    {
        $this->out($this->TwitterController->tweet());
    }
}

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

これを動かしてみます。


php ./app/Console/cake.php bot tweet

といっても、上記の一行を実行するだけです。


php ./app/Console/cake.php bot tweet
Welcome to CakePHP v2.3.9 Console
---------------------------------------------------------------
App : app
Path: /Users/yuya/Sites/test/rest/app/
---------------------------------------------------------------
hello world.

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

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


crontab -e


#bot 
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

それでは!