こんにちは、PHP Advent Calendar 2010 19日担当のhamacoです。
昨日はid:heavenshellさんの「Introduction of Net_KyotoTycoon_Rest」でした。
CodeIgniterネタがありみたいなので、今日はSabelネタでいきたいと思います。前日からの紹介にもSabelの開発者って書かれてたしね。
インストールしてブラウザで見るのだと、Apacheの設定とか面倒なので今回は全てコンソールで完結できるようにバッチ処理を作ってみたいと思います。
とりあえず動くまで
今回はとりあえず使ってみようと言うことで、アプリケーションの直下にSabelを置くことにして、パスを通したりとかそういった面倒なことは飛ばします。
% mkdir /path/to/application
% cd /path/to/application
% svn co http://www.php-framework.org/svn/sabel/trunk Sabel
% SABEL_HOME=./Sabel Sabel/bin/sabel
これで、アプリケーションが動く状態になりました。
バッチ用のアクション作成とか
Sabelのアプリケーション設置が終わったら、次はバッチが動くようにします。
まず、バッチ用のモジュールディレクトリを作成しテキトーなプログラムを置きます。
% mkdir -p app/batch/{controllers,views}
% vim app/batch/controllers/Sample.php
<?php
class Batch_Controllers_Sample extends Sabel_Controller_Page
{
public function index()
{
dump("Hello Batch World!!");
}
}
次に、ルーティングの設定をしてbatchモジュール以下にアクセスできるようにします。
以下をconfig/Map.phpのconfigureメソッドの一番上に貼り付けて下さい。
$this->route("batch")
->uri("batch/:controller/:action")
->module("batch")
->defaults(array(
":controller" => "index",
":action" => "index")
);
バッチ処理の実行
% php /path/to/application/sabel.php "batch/sample"
================================================
string(19) "Hello Batch World!!"
================================================
ここまでで気付いている人もいるかも知れませんが、Sabelはバッチ処理で特別な処理を行なう必要がない為、普通のアクションもコンソールから実行できます。
% php /path/to/application/sabel.php "index/index"
================================================
string(13) "Hello World!!"
================================================
これを利用して、コンソールから実行した時だけ強制的にmemcachedとかのキャッシュを更新できるようにしたりして、キャッシュが切れた時にアクセスが重たくならないようにしたりとかに使えるかもしれません(私は使ったことないですが)。
ちょっと問題が
ただ、コンソールから普通のアクションを叩けるという事は、そのままだと逆にバッチ処理用のプログラムがブラウザからアクセスできてしまうという事になってしまいます。
これは、config/Map.php内でコンソール専用のルーティングを用意することで対応できます。
先程のルーティングを以下の様に変えると、コンソールからアクセスした時だけのルーティングが作れます。
if (is_cli() === true) {
$this->route("batch")
->uri("batch/:controller/:action")
->module("batch")
->defaults(array(
":controller" => "index",
":action" => "index")
);
}
これで、コンソールからしかアクセスできないbatchモジュールを作ることが出来ました。後はモデル使ったりとか色々やってみて色々なバッチ処理を作ってみて下さい。