Sabelを試しつつバッチ処理を作ってみる (PHP Advent Calendar jp 2010 Day 19)

こんにちは、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とかのキャッシュを更新できるようにしたりして、キャッシュが切れた時にアクセスが重たくならないようにしたりとかに使えるかもしれません(私は使ったことないですが)。

ちょっと問題が

ただ、コンソールから普通のアクションを叩けるという事は、そのままだと逆にバッチ処理用のプログラムがブラウザからアクセスできてしまうという事になってしまいます。
f:id:hamaco:20101219010046p:image:h480

これは、config/Map.php内でコンソール専用のルーティングを用意することで対応できます。
先程のルーティングを以下の様に変えると、コンソールからアクセスした時だけのルーティングが作れます。

if (is_cli() === true) {
  $this->route("batch")
         ->uri("batch/:controller/:action")
         ->module("batch")
         ->defaults(array(
           ":controller" => "index",
           ":action"     => "index")
         );
}

これで、コンソールからしかアクセスできないbatchモジュールを作ることが出来ました。後はモデル使ったりとか色々やってみて色々なバッチ処理を作ってみて下さい。

まとめ

バッチ処理とかいいつつ、普通にHello Worldしてるだけとか。
Sabel使ってる人見たことないので役に立つかどうか分からないですが、少しでも興味を持ってくれたら試しにSabelを使ってみて感想とかくれると嬉しいなー。
他にも色々やってみたい場合Sabel PHPフレームワークを見るとか、Sabelの開発者にTwitterとかで聞いてみるとかしてみると良いんじゃないでしょうか?
Sabelのバージョンが最新ではないですが、codereposPhwittrというTwitterクローンがあるのでそちらを参考にしてみるとSabelがどんな感じのものなのか分かって良いかもしれません。Sabelの開発者自身がサンプルになるように作っているので、それなりにSabelの機能を使用しているはずです。

明日の担当は@omoonさんです。よろしくお願いしますー。