Gearman的介绍
主页在http://gearman.org/index.php, 它的主要优点有:
1. 实现了异步计算。可以将比较耗时的计算分配到分布式计算集群来减少站点服务器的压力和用户的等待。例如passport里的邮件发送/头像上传裁减/国内外数据分离请求等等。

2. 跨语言,有利于多语言多系统之间的集成。PHP/Perl/Java/C++可以融合在一起,用Perl实现的邮件发送功能PHP也能自由调用,也可以使用Perl调用另一台服务器上用C++编写的程序的一个函数。

3. 便于扩展和实现负载均衡。可以通过增加worker的数量来提供更好的性能,在其中一台出现问题的时候能够由其他的worker来完成任务。

4. 开源
5. 快速: 利用了c最小化的减少了系统开销。



Gearman的安装配置
1.安装Gearman server and library:


wget http://launchpad.net/gearmand/tr ... gearmand-0.8.tar.gztar zxf gearmand-0.8.tar.gz
cd gearmand-0.8
./configure
make
make install


2.安装Gearman PHP extension:


wget http://pecl.php.net/get/gearman-0.4.0.tgztar zxf gearman-0.4.0.tgz
cd gearman-0.4.0
phpize
./configure
make
make install


3.编辑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的响应就立即返回了。