您的位置:首页 > 编程语言 > PHP开发

Gearman安装+php邮件推送例子

2013-06-11 14:17 246 查看
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:

view source

print?

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:

view source

print?

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

运行结果如下:



这样就可以将一些费资源比如图片转换,发邮件等的操作放到另一台服务器上,通过gearman实现分布式。
一些资料:http://php.net/manual/en/book.gearman.php
http://www.ibm.com/developerworks/cn/opensource/os-gearman/index.html
http://www.ibm.com/developerworks/cn/opensource/os-php-gearman/
http://gearman.org

相关日志:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: