続・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

失敗したジョブは自動で再度キューにぶち込まれるようです。