Home » PHP, Programing » symfonyのジョブ管理プラグイン「sfJobQueuePlugin」

Check     このエントリーをはてなブックマークに追加

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]
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     このエントリーをはてなブックマークに追加
タグ: