Javaでいう「ActiveMQ」、Perlでいう「TheSchwartz」みたいなジョブキューサーバ的なもので、PHPから簡単に利用できるものがないかと探していると、symfonyのプラグインとしてありました。

その名も「sfJobQueuePlugin」です。

まあ、何がやりたいかと言うと、、Webサーバの処理等ですぐ処理しなくてもよいような処理や、Webプロセスとしてやるには時間がかかってしまったり、重たい処理なんかを、ジョブキューサーバにリクエストしておいて、非同期に処理させたい場合なんかに利用したいんですね。

例えば、メール大量送信処理とか、CSVや画像のアップロード処理なんかをキューにリクエストを送っておいて、非同期で処理⇒何かしらの手段で通知!みたいな感じをしたい時とかを想定してます。

さっそく、インストールしてみることに。

インストール

いつものプラグインインストールと同じで、プロジェクトディレクトリ下で下記のコマンドを。

symfony plugin-install http://plugins.symfony-project.com/sfJobQueuePlugin

そして、sfJobQueuePluginで利用されるテーブルを作成するため、propelのビルドを行います。

symfony propel-build-all

ジョブ、キューはDBで管理してるようです。

そして
sfJobQueuePlugin管理ツール
こんな、キューを管理するインターフェースがあるので、settings.ymlに宣言しましょう。

apps/[application]/config/settings.yml

CODE:
  1. all:
  2.   .settings:
  3.     enabled_modules:        [default, sfJob, sfJobQueue]

あとはキャッシュクリア(symfony cc)して
「http://domain/[application].php/sfJobQueue」にアクセスすれば、管理画面が見れる。

最後に、ジョブを管理するデーモンのようなものを立ち上げておく必要があるようだ。

symfony sfqueue-start-queuemanager [application]

停止するには、上記プロセスをKILLしてしまえばよい。

ジョブタイプの作成

まずは、処理させる内容(ジョブタイプ)を作成する。

作成するには、sfJobHandlerを継承して、runメソッドを実装したクラスを作成する。配置は、lib以下などにおいて置くと勝手にJobHandlerとして認識してくれる。また、呼び出し側からパラメータを受け取ることもできる。

あるパスの画像から、サムネイル画像を作成するサンプルは下記のような感じだ。

PHP:
  1. <?php
  2. class sfMakeImageJobHandler extends sfJobHandler
  3. {
  4.   public function getParamFields()
  5.   {
  6.     return array('path');
  7.   }
  8.  
  9.   public function run(array $params)
  10.   {
  11.     try
  12.     {
  13.       $thumbnail = new sfThumbnail(150, 150);
  14.       $thumbnail->loadFile($params['path']);
  15.       $thumbnail->save('/tmp/test.jpg');
  16.       //TODO ユーザに通知メールとか!
  17.       return sfJob::SUCCESS;
  18.     }
  19.     catch (Exception $e)
  20.     {
  21.       throw $e;
  22.     }
  23.   }
  24. }

「sfMakeImageJobHandler」というクラスを作成したが、実際にジョブを呼び出すときは、sfとJobHandlerが省略されて「MakeImage」と言う名前になる。

ちなみに、runメソッド内で、Exceptionをthrowすれば、管理コンソールのログからthrowしたものが見れる。またデフォルトでは、/tmp下に「sfJobQueuePlugin.log」というものがあり、Jobの実行状態を見ることができる。

キューの作成とジョブ

上記のようなジョブタイプを呼び出す、キューとジョブの作成をする。

キューはUnixでいう、1プロセスのようなもので、同時処理したい場合は複数のキューを作成すればよい。そして、キューに対してジョブを複数結びつけることができる。

actionクラス等から簡単にキューの作成とジョブの結びつけができる。

キューの作成とジョブの結びつけサンプル

PHP:
  1. //キューの作成
  2. $queue = new sfJobQueue();
  3. $queue->setName('image queue');
  4. $queue->setSchedulerName('fifo');
  5. $queue->save();
  6.  
  7. //既存のキューを呼び出すにはキューの名前で呼び出す。
  8. $queue = sfJobQueuePeer::retrieveByQueueName('image queue');
  9.  
  10. //ジョブの結びつけ
  11. $queue->addJob('MakeImage', array('path' => '/tmp/aaa.gif'));
  12.  
  13. //すぐに実行!
  14. $queue->setRequestedStatus(sfJobQueue::RUNNING);
  15. $queue->save();

簡単に紹介したが、このほかにも実行のスケジューリングができたり、ロギングの操作、ジョブキューに利用するメモリの調整等の機能もある。

詳しくは公式のプラグインページで「sfJobQueuePlugin

シンプルではあるが、なかなか使い道がありそうだ。

非同期処理は、Webのサーバサイド処理でかなり重宝されるのではないか。

blogranking←ぽちっとな