続・GearmanをPHPから使ってみた。
前のエントリの続き。
今回も、いろいろテスト。
workerを複数にしたいよ。
当然ですね。 前回なんでテストしなかったんだろう。
結論から言うと、
php worker.php
を2つ立てとけば勝手にそのworkerたちが動いてくれます。
テストのスクリプトは↓
10個タスクをぶち込むクライアント
client.php
<?php $client = new GearmanClient(); $client->addServer(); for ($i = 1; $i <= 10; $i++) { print "add $i\n"; $client->doBackground("test", $i); }
1タスク5秒かかる。
worker.php
<?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction('test', 'my_test'); while ($worker->work()); function my_test($job) { print "[begin]".$job->workload()."\n"; sleep(5); print "[ end ]".$job->workload()."\n"; }
client.phpを実行すると...
$ php client.php add 1 add 2 add 3 add 4 add 5 add 6 add 7 add 8 add 9 add 10
worker.phpを1個しか立ち上げてなければ、
$ php worker.php [begin]1 [ end ]1 [begin]2 [ end ]2 [begin]3 [ end ]3 [begin]4 [ end ]4 [begin]5 [ end ]5 [begin]6 [ end ]6 [begin]7 [ end ]7 [begin]8 [ end ]8 [begin]9 [ end ]9 [begin]10 [ end ]10
となります。
worker.phpを2個立ち上げておけば
ぞれぞれ
$ php worker.php [begin]1 [ end ]1 [begin]3 [ end ]3 [begin]5 [ end ]5 [begin]7 [ end ]7 [begin]9 [ end ]9
$ php worker.php [begin]2 [ end ]2 [begin]4 [ end ]4 [begin]6 [ end ]6 [begin]8 [ end ]8 [begin]10 [ end ]10
となります。
なので、同時実行させたい分workerを事前に起動させておけばOKです。
本当は、タスクの増減でworkerプロセスも勝手に増減してほしいですが、
gearmanでは無理っぽいので、ここはmaxプロセス立ち上げておくしかなさそうです。
もしくは、キューの溜まり具合を監視してうまいことやるか。
workerが処理中に死んだらどうなるの?
もちろん大丈夫です。当然ですが。
$ php worker.php [begin]1 [ end ]1 [begin]2 [ end ]2 [begin]3 <- ここでCtrl+D
3番のジョブを実行中に死にました。
再度、workerを起動します。
$ php worker.php [begin]4 [ end ]4 [begin]5 [ end ]5 [begin]6 [ end ]6 [begin]7 [ end ]7 [begin]8 [ end ]8 [begin]9 [ end ]9 [begin]10 [ end ]10 [begin]3 [ end ]3
失敗したジョブは自動で再度キューにぶち込まれるようです。