Archive for 3月, 2010

コンソールアプリケーション Yii Framework触るぜ日記(6)

シェルからコマンド打ってガー!
というヤツです。
cronから動かしたりメール受信した際に処理させたりと意外と使う。
今回はコレをYiiでやってみるテストです。

参考にしたのはモチロン(?)choco & moca Yiiのcron jobの作成法公式です。
今回は公式の方のタイプでやってみましたよ。

流れ

protected/直下にエントリースクリプトを置く。
protected/commands/直下にコマンドクラスを置く。
シェルからGO!!
という流れになります。

エントリースクリプト

まぁ、下記の内容でいいっす。

<?php
defined('YII_DEBUG') or define('YII_DEBUG',true);

require_once('/path/to/framework/yii.php');
$config = dirname(__FILE__).'/config/main.php';

Yii::createConsoleApplication($config)->run();

これを適当な名前でprotected直下においてくださいな。
とりあえず今回はcui.phpとして保存しました。

コマンドクラス

CConsoleCommandを継承したコマンドクラスを用意します。
このコマンドクラスをprotected/commands/の下に置く。
クラス名にCommand付けないとアレです。

<?php
class sampleCommand extends CConsoleCommand
{
	public function run( $args )
	{
		echo('sample'."\n");
	}
}

これをprotected/commands/sampleCommand.phpとして保存。
ファイル名にもCommandが必要です。

シェルからGO!

あとはシェルから入れればOKです

php ./protected/cui.php sample

これでsampleって表示されるよ!

おまけ

main.phpに設定するとCommand付けるとかいう気持ち悪さ(?)から開放されます。
protected/config/main.phpに設定を追加。

	'commandMap'=>array(
		'sample'=>'application.commands.sample'
	),

これでクラス名やファイル名にsampleってつけなくてよくなりますよ。
クラスファイルを設置するディレクトリも自由になります。

まぁ、Commandつける方が早いけどね!!!
追記:3/11 嘘です。
commandMapを設定すると通常のwebアプリの方で「commandMapなんて設定されてねーよ」エラーが出ます。
設定するなら、エントリースクリプト(この例だとcui.php)の方で$config['commandMap'] = array(‘コマンド’);って指定する必要がありますね。
ゴメンちょ(´・ω・`)