CakePHPフレームワークはブラウザの画面上で機能するWebアプリケーションだけでなく、コマンドラインで起動するシェルプログラムにも応用できます。
もちろんcronで定期的に起動することも可能です。
最も単純なシェルクラス
まずはログを出力するだけのテスト用メソッドを作ってみます。
class TestShell extends Shell {
public function main(){
$this->log('test shell', LOG_DEBUG);
}
}
これを[Cakeアプリケーションのパス]/app/vendors/shells/test.phpとして保存します。
さて、UNIXやLinux系サーバーでこれを実行するコマンドですが、
[Cakeアプリケーションのパス]/cake/console/cake test -app [Cakeアプリケーションのパス]/app >/dev/null 2>&1
という感じになります。
これで、TestShell クラスの main メソッドを実行するという意味になります。
「>/dev/null 2>&1」は、大雑把に言うと「標準出力と標準エラー出力に何か出力されても無視する」という意味です。
非常に長いコマンドなので、別途bashファイル等で処理してもいいかもしれませんが、その辺りは専門外なので割愛させていただきます。
main 以外のメソッド(ここではmethod1)を実行させたい場合は、下記のようにメソッド名を指定します。
[Cakeアプリケーションのパス]/cake/console/cake test method1 -app [Cakeアプリケーションのパス]/app >/dev/null 2>&1
シェルクラスでできること
シェルクラスの使い方はコントローラークラスとほとんど変わりません。
モデルクラスを経由してデータベースにアクセスすることも可能です。
class TestShell extends Shell {
var $uses = array('User'); // 使用するテーブルを宣言
/* 中略 */
public function method1(){ // main 以外のメソッドも作れる
$debug = Configure::read('debug'); // 設定ファイルを読むこともできる
$users = $this->User->findAll(); // モデルのメソッドを呼び出せる
}
/* 中略 */
}
引数をもつfunctionの場合どのように、shellに記述すればよいでしょうか?
例:receiveMail($id=”"){省略;}など
メソッド名のあとにコマンドライン引数をスペース区切りで記述すればよいです。
シェルクラス側では $this->args で取得できます。
Webアプリケーションの場合のパラメータとは取得方法が異なります。
参考:
http://d.hatena.ne.jp/yuhei_kagaya/20080730/1217421386