CakePHPのシェルで自動実行処理を作る

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();	// モデルのメソッドを呼び出せる
	}

	/* 中略 */
}
This entry was posted in Webプログラミング and tagged , , . Bookmark the permalink.

2 Responses to CakePHPのシェルで自動実行処理を作る

  1. shin says:

    引数をもつfunctionの場合どのように、shellに記述すればよいでしょうか?
    例:receiveMail($id=”"){省略;}など

  2. tsuchinoko says:

    メソッド名のあとにコマンドライン引数をスペース区切りで記述すればよいです。
    シェルクラス側では $this->args で取得できます。
    Webアプリケーションの場合のパラメータとは取得方法が異なります。
    参考:
    http://d.hatena.ne.jp/yuhei_kagaya/20080730/1217421386

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>