代码改变世界

Gearman安装+php邮件推送例子

2013-06-11 14:17  游乐场123  阅读(523)  评论(0编辑  收藏  举报

Gearman是一个处理分布式过程通信的健壮系统。它提供了一个通用的应用程序框架,主要用来把任务转发给

到其他机器或进程。使用Gearman 能让程序实现并行工作、负载均衡和跨语言调用。它能够用于不同类型

的应用程序,从高可用的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:

01 <?php
02 #create our client object.
03 $gmclient= new GearmanClient();
04  
05 # Add default server (localhost).
06 $gmclient->addServer("127.0.0.1",4730);#这里是通知一个worker来处理任务,worker可以在不同的地方,实现分布式和负载均衡。
07  
08 echo "Begin to Send mail\n";
09 $mail=array(
10 'username'=>'cyrec',
11 'mailto'=>'i@cyrec.org',
12 'text'=>'this is a test'
13 );#当然邮件的内容可以通过post到这个脚本来获取。
14 # Send mail
15 do
16 {
17 $result = $gmclient->do("SendMail", serialize($mail));#因为gearman协议只支持字符串地参数传递,所以如果是数组或者其他类型的参数要序列化传参。
18  
19 # Check for various return packets and errors.
20 #这下面是官方例子中的一段,主要是可以通过接受返回地状态码来执行相应地逻辑
21 switch($gmclient->returnCode())
22 {
23 case GEARMAN_WORK_DATA:
24 echo "Data: $result\n";
25 break;
26 case GEARMAN_WORK_STATUS:
27 list($numerator, $denominator)= $gmclient->doStatus();
28 echo "Status: $numerator/$denominator complete\n";
29 break;
30 case GEARMAN_WORK_FAIL:
31 echo "Failed\n";
32 exit;
33 case GEARMAN_SUCCESS:
34 echo "Mail Send Success!";
35 break;
36 default:
37 echo "RET: " . $gmclient->returnCode() . "\n";
38 exit;
39 }
40 }
41 while($gmclient->returnCode() != GEARMAN_SUCCESS);
42 ?>

worker.php:

01 <?php
02 echo "Starting\n";
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);
08  
09 # Register function "reverse" with the server.
10 $gmworker->addFunction("SendMail", "SendMail");
11  
12 print "Waiting for job...\n";
13 while($gmworker->work())#worker开始永不停止(除非手动ctrl+c)的接受client的任务
14 {
15 if ($gmworker->returnCode() != GEARMAN_SUCCESS)
16 {
17 echo "return_code: " . $gmworker->returnCode() . "\n";
18 break;
19 }
20 }
21  
22 function SendMail($job)
23 {
24 $mail = unserialize($job->workload());
25 print_r($mail);
26 #接下来就是用phpmailer来发送邮件内容。虚拟机下没有这个类就不写了,大概逻辑就这样。
27 }
28 ?>

然后运行worker,和client:

php -c /etc/php5/apache2/php.ini /var/www/worker.php #要加载配置执行否则命令模式下没有加载拓展

php -c /etc/php5/apache2/php.ini /var/www/client.php

运行结果如下:
13.png
 
这样就可以将一些费资源比如图片转换,发邮件等的操作放到另一台服务器上,通过gearman实现分布式。