時間のかかるタスクに Gearman を使用したい PHP アプリケーションがあります。いろいろ検索した結果、クライアント クラスとワーカー クラスを含む PHP API として Net_Gearman を見つけました。
Net_Gearman を使用するには、次に何をすればよいですか? Linux と Perl の知識はありません。
いくつかのことを理解してください ( https://github.com/lenn0x/net_gearmanからのいくつかのメモと、Gearman の仕組みに関する私自身の知識を使用しました) 。
まず最初に、Linux マシンに Gearmand が正しくインストールされ、実行されていることを確認する必要があります。
Ubuntu - http://www.lornajane.net/posts/2011/installing-gearman-for-php-and-ubuntu
Centos/Redhat - シンプルsudo yum install gearmand libgearman
でうまくいくはずです。ソースからのインストールに関するガイドは数多くあります。あなたはおそらくそれをしたくないでしょう。
Gearmand プロセスに接続してジョブを送信するクライアント スクリプトを作成します。
require_once 'Net/Gearman/Client.php';
$client = new Net_Gearman_Client('localhost:7003');
$client->someBackgroundJob(array(
'userid' => 5555,
'action' => 'new-comment'
));
実際のジョブ (この場合は someBackgroundJob) を処理するライブラリ/別のスクリプトを作成します。
<?php
class Net_Gearman_Job_someBackgroundJob extends Net_Gearman_Job_Common
{
public function run($args)
{
if (!isset($args['userid']) || !isset($args['action'])) {
throw new Net_Gearman_Job_Exception('Invalid/Missing arguments');
}
// Insert a record or something based on the $args
return array(); // Results are returned to Gearman, except for
// background jobs like this one.
}
}
?>
最後に、このジョブを処理するワーカーが必要です。必要に応じて、処理するジョブがなくなるまで毎分実行する cron にすることができます。その時点で、別のジョブを取得するまでそこでハングアップする必要があります。
<?php
require_once 'Net/Gearman/Worker.php';
$worker = new Net_Gearman_Worker('localhost:7003');
$worker->addAbility('someBackgroundJob');
$worker->beginWork();
?>
サーバーで Gearmand が実行されていることを確認します。Linux ターミナルで次のコマンドを実行できます。
[root@dev7 ~]# ps aux | grep gearman nobody
1826 0.0 0.1 406792 2236 ? Ssl Aug18 10:00 gearmand -d -u nobody -L 0.0.0.0 -p 4730 -P /var/run/gearmand/gearmand.pid -l /var/log/gearman/log root 4320 0.0 0.0 103240 944 pts/2 R+ 16:16 0:00 grep --color=auto gearman
service gearman-job-server start
Centos/Redhat:service gearmand start
キューにあるジョブを確認してください。以下を実行します。
(echo status ; sleep 1) | nc 127.0.0.1 4730
これは、ギアマンド サーバーが同じマシン上で実行されており、netcat
インストール済みであることを前提としています。