一.Gearman是什么?Gearman是一个分发任务的程序框架。它由三部分组成,如下图:
Gearman Client:它提供Gearman Client API给我们的应用程序调用,API可以使用是 C,PHP,Perl,MySQL UDF 等等语言,它是请求的发起者。 Gearman Job Server:将客户端的请求分发到各个Gearman Worker的调度者,相当于中央控制器,它不负责处理具体业务逻辑。 Gearman Worker:它提供Gearman Worker API给应用程序调用,具体负责客户端的请求,并将处理结果返回给客户端。
二.Gearman能干什么?通过上面可以看出,在Gearman Client和Gearman Worker可以使用不同的编程语言,这给我们在不同语言通信提供了机会。比如客户端我们用的是PHP,在具体处理的Gearman Worker中,我们则可以使用C。
另外,由于中间的Gearman Job Server,它可以把一个请求分发到众多worker中的一个,可以用来做负载均衡。另外,Gearman在处理并发方面也是大大有用的。
三.Gearman的安装使用首先下载Gearman的相关源码,地址:gearmand:http://launchpad.net/gearmand/trunk/0.24/+download/gearmand-0.24.tar.gz
libgearman (C):Gearman PHP Extension:我们为了清楚的演示,将gearmand安装在192.168.132.30(Job server)上面,在分别将Gearman PHP扩展安装的机器192.168.132.64(worker)和192.168.132.68(client)上面。Worker及client我们都使用PHP语言。在192.168.132.30(Job server)上面:
tar xvzf gearmand-0.24.tar.gz cd gearmand-0.24/ ./configure make sudo make install //如果在configure时报错,则可能缺少包,可能需要安装如下包: sudo apt-get install libboost-program-options-dev libevent-dev uuid-dev //开启Gearmand服务 gearmand -d
在192.168.132.64(worker)和192.168.132.68(client),分别如下:
//首先安装PHP 扩展需要的libgearman tar xvzf gearmand-0.14.tar.gz cd gearmand ./configure make sudo make install //如果在configure时报错,则可能缺少包,可能需要安装如下包: sudo apt-get install libboost-program-options-dev libevent-dev uuid-dev //安装PHP扩展 tar xvzf gearman-0.7.0.tgz cd gearman phpize ./configure --with-php-config=/data0/php52/bin/php-config make make install //找到PHP的配置文件php.ini,编辑它 vim php.ini //在php.ini的末尾加上 extension=gearman.so
以上都好了以上,可以使用 php -re gearman看一些是不是gearman扩展安装成功了。
下面我们来测试一下:在192.168.132.64(worker),编辑文件worker.php:
addServer("192.168.132.30",4730); //连接到Job server 上 $worker->addFunction("reverse","my_reverse_function"); while ($worker->work()); function my_reverse_function($job) { returnstrrev($job->workload())." worker1"; } ?>
然后在后台运行该文件:php worker.php &.再编辑一个文件worker2.php,输入内容:
addServer("192.168.132.30",4730); //连接到Job server 上 $worker->addFunction("reverse","my_reverse_function"); while ($worker->work()); function my_reverse_function($job) { returnstrrev($job->workload())." worker2"; } ?>
在后台运行该文件:php worker2.php &在192.168.132.68(client),编辑文件 client.php:
addServer("192.168.132.30",4730); //连接到Job server上 echo$client->do("reverse","Hello World!"); ?>
然后多次运行php client.php,应该可以看见输出不同的结果。