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.3PECLの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.soGearman 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