的应用程序,从高可用的web站点到数据库复制传输,下面是Gearman的一些 优势。
- 开源 - 免费
- 多语言支持 - 支持多种语言,而且会越来越多,也实现在客户端用A语言提交任务,Worker端用B语言进行处理。
- 灵活 - 不用受制于特定的模式,可以快速实现应用的集成。
- 快速 - Gearman协议简单,并且有经过优化的C语言实现的Server,可以最小化应用程序的开销。
- 可内嵌 - 由于Gearman 快速且轻量,所以适用于于各种规模的程序,可以以最小的代价引入已经存在的应用程序。
- 没有单点失败 - Gearman不仅带来伸缩性,也带来更好的容错性。
在ubuntu下搭建gearman步骤如下:
1:下载gearman安装包,最新版本的编译失败,要升级一些依赖包,这里测试玩玩 所以安装个低点地版
本: wget http://launchpad.net/gearmand/trunk/0.13/+download/gearmand-0.13.tar.gz
2:安装依赖包 apt-get install uuid-dev libevent-dev
3:编译安装gearmand
tar xvzf gearmand-0.13.tar.gz
cd gearmand-0.13
./configure
make
make install
4:安装gearman php扩展,pecl install gearman-0.7.0
5:添加模块
vi /etc/php5/apache2/php.ini
extension = gearman.so
然后在phpinfo中验证是否加载。
6:启动gearmand job server守护程序
/usr/local/sbin/gearmand -d -u nobody
7:查看进程是否开启,netstat -antup|grep gearmand
tcp6 0 0 :::4730 :::* LISTEN 8108/gearmand
安装时常见的问题有:
1.configure: error: no acceptable C compiler found in $PATH
解决:sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc
2.configure: error: No working C++ Compiler has been found. gearmand requires a C+
解决:sudo apt-get install gcc build-essential g++ rpm
3.configure: error: cannot find Boost headers version >= 1.37.0
解决:sudo wget http://connie.slackware.com/~alien/slackbuilds/boost/build/boost_1_38_0.tar.bz2
sudo tar -xjvf boost_1_38_0.tar.bz2
sudo make
sudo make install
4.configure: error: libevent is required for gearmand. On Debian this can be found in libevent-dev. On RedHat this can be found in libevent-devel.
解决::sudo apt-get install libevent-dev
5.configure: error: Couldn't find uuid/uuid.h. On Debian this can be found in uuid-dev. On Redhat this can be found in e2fsprogs-devel.
解决: sudo apt-get install uuid-dev
下面是一个PHP实例具体API和更多例子可以在PHP手册上gearmanAPI找到(PHP手册上例子真的很详细,
本来还想玩玩C的API来试着写下服务端,无奈官网上C的API部分没有work部分的例子,只有安装包中有个
example结果还编译失败):
模拟做一个邮件推送
client.php:
02 |
#create our client object. |
03 |
$gmclient = new GearmanClient(); |
05 |
# Add default server (localhost). |
06 |
$gmclient ->addServer( "127.0.0.1" ,4730);#这里是通知一个worker来处理任务,worker可以在不同的地方,实现分布式和负载均衡。 |
08 |
echo "Begin to Send mail\n" ; |
11 |
'mailto' => 'i@cyrec.org' , |
12 |
'text' => 'this is a test' |
13 |
);#当然邮件的内容可以通过post到这个脚本来获取。 |
17 |
$result = $gmclient -> do ( "SendMail" , serialize( $mail ));#因为gearman协议只支持字符串地参数传递,所以如果是数组或者其他类型的参数要序列化传参。 |
19 |
# Check for various return packets and errors. |
20 |
#这下面是官方例子中的一段,主要是可以通过接受返回地状态码来执行相应地逻辑 |
21 |
switch ( $gmclient ->returnCode()) |
23 |
case GEARMAN_WORK_DATA: |
24 |
echo "Data: $result\n" ; |
26 |
case GEARMAN_WORK_STATUS: |
27 |
list( $numerator , $denominator )= $gmclient ->doStatus(); |
28 |
echo "Status: $numerator/$denominator complete\n" ; |
30 |
case GEARMAN_WORK_FAIL: |
34 |
echo "Mail Send Success!" ; |
37 |
echo "RET: " . $gmclient ->returnCode() . "\n" ; |
41 |
while ( $gmclient ->returnCode() != GEARMAN_SUCCESS); |
worker.php:
03 |
# Create our worker object. |
04 |
$gmworker = new GearmanWorker(); |
05 |
# Add default server (localhost). |
06 |
$gmworker ->addServer( "127.0.0.1" ,4730);#这里可以添加多个服务端,比如在不同的地方有同样的服务,gearman会自动选择空间的worker来作业。 |
07 |
$gmworker ->addServer( "127.0.0.2" ,4730); |
09 |
# Register function "reverse" with the server. |
10 |
$gmworker ->addFunction( "SendMail" , "SendMail" ); |
12 |
print "Waiting for job...\n" ; |
13 |
while ( $gmworker ->work())#worker开始永不停止(除非手动ctrl+c)的接受client的任务 |
15 |
if ( $gmworker ->returnCode() != GEARMAN_SUCCESS) |
17 |
echo "return_code: " . $gmworker ->returnCode() . "\n" ; |
22 |
function SendMail( $job ) |
24 |
$mail = unserialize( $job ->workload()); |
26 |
#接下来就是用phpmailer来发送邮件内容。虚拟机下没有这个类就不写了,大概逻辑就这样。 |
然后运行worker,和client:
php -c /etc/php5/apache2/php.ini /var/www/worker.php #要加载配置执行否则命令模式下没有加载拓展
php -c /etc/php5/apache2/php.ini /var/www/client.php
运行结果如下:
这样就可以将一些费资源比如图片转换,发邮件等的操作放到另一台服务器上,通过gearman实现分布式。