November 2, 2013

Ubuntu13.04にPECLのgearmanパッケージをインストールして簡単なサンプルを実行してみる

Gearman公式
http://gearman.org/

PECL :: Package :: gearman
http://pecl.php.net/package/gearman

PHP: Gearman - Manual
http://us3.php.net/gearman

1. 必要なパッケージをインストールします。
# Gearman Job Serverがリモートならlibgearman-devのみで良いかもしれません。
$ sudo apt-get -y install gearman libgearman-dev

$ sudo pecl install gearman-1.0.3
PECLのgearmanパッケージを最新バージョン(今日現在で1.1.2)でインストールしようとすると、libgearmanのバージョンとの関係で以下のエラーが出ました。
configure: error: libgearman version 1.1.0 or later required
このエラーはgearman-1.1.0をインストールすれば解決出来ましたが、更に以下のエラーが出たのでgearman-1.0.3にしています。
http://www.phamviet.net/2012/10/10/ubuntu-php-5-4-x-and-gearman-troubleshooting/
(ホントは頑張って最新にすべきなのかもしれませんが、とりあえず。。。)

コマンドから使用されるphp.iniに以下を追記します。
extension=gearman.so
Gearman Job Serverを起動してステータスを確認してみます。
$ sudo gearmand -d
$ gearadmin --status
.
何のジョブもないので、ドットが一つ表示されるだけです。



2. ジョブを実行するworker.phpを作成します。
<?php

// GearmanWorkerのインスタンスを作成します。
$worker = new GearmanWorker();

// 第一引数はホスト(デフォルト127.0.0.1)、第二引数はポート(デフォルト4730)です。
$worker->addServer();

// ジョブ名とコールバック関数を対にして登録します。
// $countは動作確認のために渡しています。
$count = 0;
$worker->addFunction('my_first_job', 'callback_function', $count);

// 無限ループで常駐させます。
while ($worker->work());

// "my_first_job"に対するコールバック関数です。
function callback_function(GearmanJob $job, &$count)
{
    $data = json_decode($job->workload());
    $count++;
    return "Hello {$data->name}! You have visited {$count} times.";
}
起動します。
$ php worker.php
別のコンソールでGearman Job Serverのステータスを確認すると、"my_first_job"に対する1つのワーカー(右端の数値)が確認できます。
$ gearadmin --status
my_first_job 0 0 1
.
各数値は左から順に"未実行タスク"、"実行中タスク"、"ワーカー数"。らしいです。

尚、ワーカーを永続化するには、Supervisorあたりが良いでしょうか。
http://supervisord.org/



3. ジョブを登録するclient.phpを作成します。
<?php

// GearmanClientのインスタンスを作成します。
$client = new GearmanClient();

// 第一引数はホスト(デフォルト127.0.0.1)、第二引数はポート(デフォルト4730)です。
$client->addServer();

// ジョブ名とパラメータを対にして登録します。
$result = $client->do('my_first_job', '{"name":"mamor"}');

// 結果をコンソールに出力します。
echo $result.PHP_EOL;
3回ほど実行してみます。
$ php client.php
Hello mamor! You have visited 1 times.
$ php client.php
Hello mamor! You have visited 2 times.
$ php client.php
Hello mamor! You have visited 3 times.
尚、結果を待つ必要がないジョブの場合、GearmanClientのdo()ではなくdoBackground()でバックグラウンド実行ができるっぽいです。
http://www.php.net/manual/en/gearmanclient.dobackground.php

No comments:

Post a Comment