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
それでは!