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
[code]
all:
.settings:
enabled_modules: [default, sfJob, sfJobQueue]
[/code]
あとはキャッシュクリア(symfony cc)して
「http://domain/[application].php/sfJobQueue」にアクセスすれば、管理画面が見れる。
最後に、ジョブを管理するデーモンのようなものを立ち上げておく必要があるようだ。
symfony sfqueue-start-queuemanager [application]
停止するには、上記プロセスをKILLしてしまえばよい。
ジョブタイプの作成
まずは、処理させる内容(ジョブタイプ)を作成する。
作成するには、sfJobHandlerを継承して、runメソッドを実装したクラスを作成する。配置は、lib以下などにおいて置くと勝手にJobHandlerとして認識してくれる。また、呼び出し側からパラメータを受け取ることもできる。
あるパスの画像から、サムネイル画像を作成するサンプルは下記のような感じだ。
[php]
loadFile($params[‘path’]);
$thumbnail->save(‘/tmp/test.jpg’);
//TODO ユーザに通知メールとか!
return sfJob::SUCCESS;
}
catch (Exception $e)
{
throw $e;
}
}
}
[/php]
「sfMakeImageJobHandler」というクラスを作成したが、実際にジョブを呼び出すときは、sfとJobHandlerが省略されて「MakeImage」と言う名前になる。
ちなみに、runメソッド内で、Exceptionをthrowすれば、管理コンソールのログからthrowしたものが見れる。またデフォルトでは、/tmp下に「sfJobQueuePlugin.log」というものがあり、Jobの実行状態を見ることができる。
キューの作成とジョブ
上記のようなジョブタイプを呼び出す、キューとジョブの作成をする。
キューはUnixでいう、1プロセスのようなもので、同時処理したい場合は複数のキューを作成すればよい。そして、キューに対してジョブを複数結びつけることができる。
actionクラス等から簡単にキューの作成とジョブの結びつけができる。
キューの作成とジョブの結びつけサンプル
[php]
//キューの作成
$queue = new sfJobQueue();
$queue->setName(‘image queue’);
$queue->setSchedulerName(‘fifo’);
$queue->save();
//既存のキューを呼び出すにはキューの名前で呼び出す。
$queue = sfJobQueuePeer::retrieveByQueueName(‘image queue’);
//ジョブの結びつけ
$queue->addJob(‘MakeImage’, array(‘path’ => ‘/tmp/aaa.gif’));
//すぐに実行!
$queue->setRequestedStatus(sfJobQueue::RUNNING);
$queue->save();
[/php]
簡単に紹介したが、このほかにも実行のスケジューリングができたり、ロギングの操作、ジョブキューに利用するメモリの調整等の機能もある。
詳しくは公式のプラグインページで「sfJobQueuePlugin」
シンプルではあるが、なかなか使い道がありそうだ。
非同期処理は、Webのサーバサイド処理でかなり重宝されるのではないか。
Check Tweet