Gearman的安装配置
1.安装Gearman server and library:wget http://launchpad.net/gearmand/tr ... gearmand-0.8.tar.gz
tar zxf gearmand-0.8.tar.gz
cd gearmand-0.8
./configure
make
make install2.安装Gearman PHP extension:wget http://pecl.php.net/get/gearman-0.4.0.tgz
tar zxf gearman-0.4.0.tgz
cd gearman-0.4.0
phpize
./configure
make
make install3.编辑php.ini配置文件加载相应模块并使之生效:
extension = "gearman.so"4.启动Job:gearmand -d如果当前用户是root的话,则需要这样操作:
gearmand -d -u root缺省会使用4730端口,下面会用到。
以调试的方式启动:
gearmand -vv
5.编写Worker:worker.php文件内容如下:
<?php
$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('reverse', 'my_reverse_function');
while ($worker->work());
function my_reverse_function($job)
{
return strrev($job->workload());
}
?> 设置后台运行work:
php worker.php &6.编写Client:client.php文件内容如下:
<?php
$client= new GearmanClient();
$client->addServer('127.0.0.1', 4730);
echo $client->do('reverse', 'Hello World!'), "/n";
?>运行client:
php client.php输出:!dlroW olleH
可能遇到的问题
- Couldn't find uuid/uuid.h
解决办法:在新立得里搜索并安装uuid-dev。
- gearmand: error while loading shared libraries: libgearman.so.1: cannot open shared object file: No such file or directory
libgearman.so一般是在 /usr/local/lib下,看看/etc/ld.so.conf是否包含这个目录,执行/sbin/ldconfig -v刷新一下。
- Fatal error: Class 'GearmanWorker' not found
是否在cli的php.ini下加入“extension="gearman.so"”这一行配置。
Gearman与Perl
安装Gearman模块,使用Gearman::Worker和Gearman::Client模块即可。
具体编码方式可参考cpan。
需要注意的是$client->do_task()方法返回的是一个reference。
下面是例子。
worker.pl
- use Gearman::Worker;
- my $worker = Gearman::Worker->new;
- $worker->job_servers('127.0.0.1:4730');
- $worker->register_function("reverse", /&test);
- $worker->work while 1;
-
- sub test {
- return join(' ', $_[0]->handle, $_[0]->arg, 'world', "/n");
- }
client.pl
- use Gearman::Client;
- my $client = Gearman::Client->new;
- $client->job_servers('127.0.0.1:4730');
-
- # running a single task
- my $result = $client->do_task("reverse", "hello"); # return a scalar reference
- print $$result;
Gearman异步模式的实现
在Perl的Gearman::Client模块里已经实现了异步的方法,采用dispatch_background时client请求不会等待worker的响应就立即返回了。