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