hmslucky 2011-07-21
wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gz
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable/
./configure --prefix=/usr
make && make install
/sbin/ldconfig
cd ../
安装Gearman server and library:
wget http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz
tar zxvf gearmand-0.9.tar.gz
cd gearmand-0.9
./configure
make
make install
/sbin/ldconfig
cd ../
安装Gearman PHP extension:
wget http://pecl.php.net/get/gearman-0.5.0.tgz
tar zxvf gearman-0.5.0.tgz
cd gearman-0.5.0
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-gearman
make
make install
cd ../
编辑php.ini配置文件加载相应模块并使之生效:
extension = "gearman.so"
启动Job:
gearmand -d
如果当前用户是root的话,则需要这样操作:
gearmand -d -u root
缺省会使用4730端口,下面会用到。
注意:如果找不到gearmand命令的路径,别忘了用whereis gearmand确认。
我们可以用 ps 指令來查看启动是否成功:
编写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 /var/www/html/worker.php &
编写Client:
client.php文件内容如下:
<?php
$client= new GearmanClient();
$client->addServer('127.0.0.1', 4730);
echo $client->do('reverse', 'Hello World!'), "\n";
?>
运行client:
#php /var/www/html/client.php
输出:!dlroW olleH
首先, PHP Gearman Extension 提供了一个名为GearmanClient 的类别,它可以让程序安排工作给 Job Server 。
而 addServer 方法表示要通知的是哪些 Job Server ,也就是说如果有多台 Job Server 的话,就可以透过 addServer 新增。
然后我们将要呼叫哪个 Worker 以及该 Worker 所需要的数据,利用 GearmanClient 的doBackground 方法传送过去。 doBackground 方法顾名思义就是在背景执行, Client 在丢出需求后就可以继续处理其他的程序。
=============
$client->doBackground('sendEmail', serialize($emailData));
echo "Email sending is done.\n";
============
doBackground 方法的第一个参数是告诉 Job Server 要执行哪个功能,而这个功能则是由 Worker 提供的;要注意是,这个参数只是识别用的,并不是真正的函式名称。而第二个参数是要传给 Worker 的数据,它必须是个字符串;因此如果要传送的是数组的话,我们就要用 PHP 的 serialize 函式来对这些资料做串行化。
出于方便的考虑,Worker,Client使用的都是PHP,但这并不影响演示,实际应用中,你完全可以通过Gearman集成不同语言实现的Worker,Client。或许此时你还想了解前面提到的负载均衡功能:很简单,只要增加多个Worker即可,你可以按照worker.php的样子多写几个类似的文件,并设置不同的返回值用以识别演示效果。然后依次启动这几个Worker文件,并多次使用client.php去请求,你就会发现Job会把Client请求转发给不同的Worker。
以守护进程启动
gearmand -L 192.168.0.1 -p 4730 -u root -d
命令行工具
如果你觉得安装PHP之类的东西太麻烦的话,你也可以仅仅通过命令行工具来体验Gearman的功能:
启动Worker:gearman -w -f wc -- wc -l &
运行Client:gearman -f wc < /etc/passwd
具体可以参考官方文档。
show tables;就可以看到下面多了个“gearman_queue”的表。也就是说,如果一个mysql的连接,超过28800s没有任何响应,就会断开。或者,干脆直接放弃用mysql的持久化方式。