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で管理してるようです。
そして

こんな、キューを管理するインターフェースがあるので、settings.ymlに宣言しましょう。
apps/[application]/config/settings.yml
あとはキャッシュクリア(symfony cc)して
「http://domain/[application].php/sfJobQueue」にアクセスすれば、管理画面が見れる。
最後に、ジョブを管理するデーモンのようなものを立ち上げておく必要があるようだ。
symfony sfqueue-start-queuemanager [application]
停止するには、上記プロセスをKILLしてしまえばよい。
まずは、処理させる内容(ジョブタイプ)を作成する。
作成するには、sfJobHandlerを継承して、runメソッドを実装したクラスを作成する。配置は、lib以下などにおいて置くと勝手にJobHandlerとして認識してくれる。また、呼び出し側からパラメータを受け取ることもできる。
あるパスの画像から、サムネイル画像を作成するサンプルは下記のような感じだ。
「sfMakeImageJobHandler」というクラスを作成したが、実際にジョブを呼び出すときは、sfとJobHandlerが省略されて「MakeImage」と言う名前になる。
ちなみに、runメソッド内で、Exceptionをthrowすれば、管理コンソールのログからthrowしたものが見れる。またデフォルトでは、/tmp下に「sfJobQueuePlugin.log」というものがあり、Jobの実行状態を見ることができる。
上記のようなジョブタイプを呼び出す、キューとジョブの作成をする。
キューはUnixでいう、1プロセスのようなもので、同時処理したい場合は複数のキューを作成すればよい。そして、キューに対してジョブを複数結びつけることができる。
actionクラス等から簡単にキューの作成とジョブの結びつけができる。
キューの作成とジョブの結びつけサンプル
簡単に紹介したが、このほかにも実行のスケジューリングができたり、ロギングの操作、ジョブキューに利用するメモリの調整等の機能もある。
詳しくは公式のプラグインページで「sfJobQueuePlugin」
シンプルではあるが、なかなか使い道がありそうだ。
非同期処理は、Webのサーバサイド処理でかなり重宝されるのではないか。
Leave a reply