gearman异步队列安装流程
必备条件:你的centos需要提前安装了lnmp,如果没有安装可以参照教程:
基础安装包
[plain] view plain copy
yum install vim wget gcc gcc-c++ make dos2unix gperf libevent libevent-devel zlib-devel bzip2-devel openssl-devel ncurses-devel boost boost-devel mysql-devel
安装gearman 异步队列
[plain] view plain copy
# wget https://launchpad.net/gearmand/1.2/1.1.9/+download/gearmand-1.1.9.tar.gz
# tar -zxvf gearmand-1.1.9.tar.gz
# cd gearmand-1.1.9
# ./configure 如果出现错误请查看下面的错误解决
成功后如下
[plain] view plain copy
* LIBS:
* LDFLAGS Flags:
* Assertions enabled: no
* Debug enabled: no
* Warnings as failure: no
* Building with libsqlite3 no
* Building with libdrizzle no
* Building with libmemcached not found
* Building with libpq no
* Building with tokyocabinet no
* Building with libmysql yes
* SSL enabled: no
* make -j: 3
* VCS checkout: no
[plain] view plain copy
# make
# make install
安装gearman php 扩展
[plain] view plain copy
# wget http://pecl.php.net/get/gearman
# mv gearman gearman.tar.gz
# tar -zxvf gearman.tar.gz
# cd gearman-1.1.2/
# phpize
# ./configure
# make
# make install
# cd /etc/php.d/
# cp gd.ini gearman.ini
# vim gearman.ini
[plain] view plain copy
; Enable gearman extension module
extension=gearman.so
[plain] view plain copy
# service php-fpm restart
错误解决
在configure过程中出现了以下错误:
[plain] view plain copy
checking for Boost headers version >= 1.39.0… no
configure: error: cannot find Boost headers version >= 1.39.0
解决办法:
[plain] view plain copy
# yum search boost
# yum install boost.x86_64
# yum install boost-devel.x86_64
继续执行./configure出现以下错误
[plain] view plain copy
checking for gperf... no
configure: error: could not find gperf
解决办法:
[plain] view plain copy
#yum search gperf
#yum install gperf.x86_64
继续执行./configure出现以下错误
[plain] view plain copy
checking test for a working libevent... no
configure: error: Unable to find libevent
解决办法:
[plain] view plain copy
# yum install libevent libevent-devel
gearman 参数说明
[plain] view plain copy
Client mode: gearman [options] [<data>]
Worker mode: gearman -w [options] [<command> [<args> ...]]
Common options to both client and worker modes.
-f <function> - Function name to use for jobs (can give many)
-h <host> - Job server host
-H - Print this help menu
-v - Print diagnostic information to stdout(false)
-p <port> - Job server port
-t <timeout> - Timeout in milliseconds
-i <pidfile> - Create a pidfile for the process
Client options:
-b - Run jobs in the background(false)
-I - Run jobs as high priority
-L - Run jobs as low priority
-n - Run one job per line(false)
-N - Same as -n, but strip off the newline(false)
-P - Prefix all output lines with functions names
-s - Send job without reading from standard input
-u <unique> - Unique key to use for job
Worker options:
-c <count> - Number of jobs for worker to run before exiting
-n - Send data packet for each line(false)
-N - Same as -n, but strip off th
修改php.ini,以下加入语句加入:
extension=/usr/local/server/php-5.4.14/lib/php/extensions/no-debug-non-zts-20100525/gearman.so
重启php-fpm,用phpinfo查看是否安装成功
# service php-fpm restart
新建 var/log/gearmand.log 日志文件
启动gearmand
gearmand --log-file gearmand.log --listen 127.0.0.1 --port=4730 --verbose=INFO &
二、简单的使用gearman
gearman中请求的处理过程一般涉及三种角色:client->job->worker
其中client是请求的发起者
job是请求的调度者,用于把客户的请求分发到不同的worker上进行工作
worker是请求的处理者
比如这里我们要处理client向job发送一个请求,来计算两个数之和,job负责调度worker来具体实现计算两数之和。
首先我们编写client.php
<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);
//doNormal是同步的,等待worker处理完成返回结果
//建议不要使用do()了
$ret = $client->doNormal('sum', serialize(array(10, 10)));
if($ret) {
echo '计算结果:', $ret, "\n";
}
再编写worker.php
<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('sum', function($job) {
//workload()获取客户端发送来的序列化数据
$data = unserialize($job->workload());
return $data[0] + $data[1];
});
//死循环
while(true) {
//等待job提交的任务
$ret = $worker->work();
if ($worker->returnCode() != GEARMAN_SUCCESS) {
break;
}
}
我们先启动gearmand服务
1
2
> mkdir -p /usr/local/var/log
> gearmand -d
运行worker文件
1> /data/php56/bin/php /data/worker.php
再运行client文件
1> /data/php56/bin/php /data/client.php
结果如下:
三、gearman异步的处理任务
这里我们client向job发送一个发送邮件的请求,不等待请求完成,继续向下执行。
client.php代码如下:
<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);
//doBackground异步,返回提交任务的句柄
$ret = $client->doBackground('sendEmail', json_encode(array(
'email' => 'test@qq.com',
'title' => '测试异步',
'body' => '异步执行好牛B的样子',
)));
//继续执行下面的代码
echo "我的内心毫无波动,甚至还想笑\n";
do {
sleep(1);
//获取任务句柄的状态
//jobStatus返回的是一个数组
//第一个,表示工作是否已经知道
//第二个,工作是否在运行
//第三和第四,分别对应完成百分比的分子与分母
$status = $client->jobStatus($ret);
echo "完成情况:{$status[2]}/{$status[3]}\n";
if(!$status[1]) {
break;
}
} while(true);
worker.php代码如下:
<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('sendEmail', function($job) {
//workload()获取客户端发送来的序列化数据
$data = json_decode($job->workload(), true);
//模拟发送邮件所用时间
sleep(6);
echo "发送{$data['email']}邮件成功\n";
});
//死循环
//等待job提交的任务
while($worker->work());
结果如下:
四、gearman并行的执行多个任务
我们如何并行的计算两个数的累加和? 通过addTask添加多个任务到队列,然后进行并行计算。
client.php代码如下:
<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);
//设置任务完成时的回调函数
$client->setCompleteCallback(function($task) {
//获取由worker返回的数据
echo $task->data(), "\n";
});
//计算1到500的累加和
//添加五个任务到队列
$client->addTask('sum', json_encode(array(1, 100)));
$client->addTask('sum', json_encode(array(100, 200)));
$client->addTask('sum', json_encode(array(200, 300)));
$client->addTask('sum', json_encode(array(300, 400)));
$client->addTask('sum', json_encode(array(400, 500)));
//运行队列中的任务,do系列不需要runTask()
$client->runTasks();
worker.php代码如下:
<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('sum', function($job) {
//workload()获取客户端发送来的序列化数据
$data = json_decode($job->workload(), true);
sleep(1);
$sum = 0;
for($ix = $data[0]; $ix < $data[1]; ++$ix) {
$sum += $ix;
}
return $sum;
});
//死循环
//等待job提交的任务
while($worker->work());
我们开启5个worker工作进程,当运行客户端请求时,5个计算任务几乎是同时返回结果。
结果如下:
服务器上启动gearman
exec('/usr/local/php/bin/php /data/vhosts/meat.xingyun.net/manager/public_html/protected/yiic.phpRemindWorker',$info);
var_dump($info);
服务器上查看geraman已启动的worker
gearadmin --workers
启动服务:
gearmand --log-file gearmand.log --listen 127.0.0.1 --port=4730 --verbose=INFO &
网友评论