注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

曾国藩的博客

 
 
 

日志

 
 

gearman异步队列安装及使用教程  

2014-05-21 10:52:29|  分类: 网络/系统架构/版 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://blog.csdn.net/e421083458/article/details/21283113

性能
? 以下测试数值为虚拟机
? 常规HTTP的Curl:这个受端口最大值及打开文件句柄数限制
? 当使用HTTP Curl时
? 同步:2000/sec

? Gearman:未优化情况下
? 用PHP+gearman揑件测试并发批量调用:
? 同步:4000/sec
? 异步:10000/sec
? 以上还有上升空间,官方测试数据为5w/sec
? 增加持久化揑件设置后性能会下降一些

gearman异步队列安装流程


必备条件:你的centos需要提前安装了lnmp,如果没有安装可以参照教程:
http://blog.csdn.net/e421083458/article/details/21083051
http://blog.csdn.net/e421083458/article/details/21089901

基础安装包

  1. 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  
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 异步队列

  1. # wget https://launchpad.net/gearmand/1.2/1.1.9/+download/gearmand-1.1.9.tar.gz  
  2. # tar -zxvf gearmand-1.1.9.tar.gz  
  3. # cd gearmand-1.1.9  
  4. # ./configure   如果出现错误请查看下面的错误解决  
# 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   如果出现错误请查看下面的错误解决




成功后如下

  1. * LIBS:                        
  2. * LDFLAGS Flags:               
  3. * Assertions enabled:        no  
  4. * Debug enabled:             no  
  5. * Warnings as failure:       no  
  6. * Building with libsqlite3   no  
  7. * Building with libdrizzle   no  
  8. * Building with libmemcached not found  
  9. * Building with libpq        no  
  10. * Building with tokyocabinet no  
  11. * Building with libmysql     yes  
  12. * SSL enabled:               no  
  13. * make -j:                   3  
  14. * VCS checkout:              no  
* 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




 

  1. #  make  
  2. #  make install  
#  make
#  make install





 

安装gearman php 扩展


 

  1. # wget http://pecl.php.net/get/gearman  
  2. # mv gearman gearman.tar.gz  
  3. # tar -zxvf gearman.tar.gz  
  4. # cd gearman-1.1.2/  
  5. # phpize  
  6. # ./configure  
  7. # make  
  8. # make install  
  9. # cd /etc/php.d/  
  10. # cp gd.ini gearman.ini  
  11. # vim gearman.ini  
# 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


 

  1. ; Enable gearman extension module  
  2. extension=gearman.so  
; Enable gearman extension module
extension=gearman.so


 

  1. # service php-fpm restart  
# service php-fpm restart



错误解决

在configure过程中出现了以下错误:

  1. checking for Boost headers version >= 1.39.0… no  
  2. configure: error: cannot find Boost headers version >= 1.39.0  
checking for Boost headers version >= 1.39.0… no
configure: error: cannot find Boost headers version >= 1.39.0



解决办法:

  1. # yum search boost  
  2. # yum install boost.x86_64  
  3. # yum install boost-devel.x86_64  
# yum search boost
# yum install boost.x86_64
# yum install boost-devel.x86_64




继续执行./configure出现以下错误

  1. checking for gperf... no  
  2. configure: error: could not find gperf  
checking for gperf... no
configure: error: could not find gperf




解决办法:

  1. #yum search gperf  
  2. #yum install gperf.x86_64  
#yum search gperf
#yum install gperf.x86_64




继续执行./configure出现以下错误

  1. checking test for a working libevent... no  
  2. configure: error: Unable to find libevent  
checking test for a working libevent... no
configure: error: Unable to find libevent



解决办法:

  1. # yum install libevent libevent-devel  
# yum install libevent libevent-devel






gearman 参数说明

  1. Client mode: gearman [options] [<data>]  
  2. Worker mode: gearman -w [options] [<command> [<args> ...]]  
  3.   
  4. Common options to both client and worker modes.  
  5.     -f <function> - Function name to use for jobs (can give many)  
  6.     -h <host>     - Job server host  
  7.     -H            - Print this help menu  
  8.     -v            - Print diagnostic information to stdout(false)  
  9.     -p <port>     - Job server port  
  10.     -t <timeout>  - Timeout in milliseconds  
  11.     -i <pidfile>  - Create a pidfile for the process  
  12.   
  13. Client options:  
  14.     -b            - Run jobs in the background(false)  
  15.     -I            - Run jobs as high priority  
  16.     -L            - Run jobs as low priority  
  17.     -n            - Run one job per line(false)  
  18.     -N            - Same as -n, but strip off the newline(false)  
  19.     -P            - Prefix all output lines with functions names  
  20.     -s            - Send job without reading from standard input  
  21.     -u <unique>   - Unique key to use for job  
  22.   
  23. Worker options:  
  24.     -c <count>    - Number of jobs for worker to run before exiting  
  25.     -n            - Send data packet for each line(false)  
  26.     -N            - Same as -n, but strip off the newline(false)  
  27.     -w            - Run in worker mode(false)   
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 the newline(false)
    -w            - Run in worker mode(false) 


    

gearman异步队列使用:


下面先做个命令行测试:

首先开两个命令行窗口:
tty1:

  1. # gearman -w -f abc  -- wc  -m  
# gearman -w -f abc  -- wc  -m



表示统计用户输入了多少个字符。
tty2:

  1. # gearman -f abc 'aaaa'  
# gearman -f abc 'aaaa'



4
输出结果正确。

  1. # gearman -f abc < /etc/php.ini  
# gearman -f abc < /etc/php.ini



当然也可以直接从文件中读入内容。
 

下面使用php做同步列队测试:


 

  1. # vi /var/www/html/company/gearman/worker.php  
# vi /var/www/html/company/gearman/worker.php



只要能保证nginx能访问到就可以

  1. <?php  
  2. $workernew GearmanWorker();  
  3. $worker->addServer('127.0.0.1', 4730); //连接job服务器  
  4. $worker->addFunction('reverse''my_reverse_function');  //注册支持任务及对应函数  
  5.   
  6. while ($worker->work());    //循环等待任务,没有时阻塞,循环体内可以放错误处理  
  7. //work内尽量不要出现资源忘记回收情况  
  8. //处理任务的回调函数  
  9.   
  10. function my_reverse_function($job)  
  11. {  
  12.     $workload = $job->workload();   //过来的参数  
  13.     $result = strrev($workload);    //运算  
  14.     $content = file_get_contents("http://www.google.com");    //加大运算时间  
  15.       
  16.     //加入执行日志  
  17.     $file = fopen("worker_counter.log","a+");  
  18.     fwrite($file,date("Y-m-d H:i:s")."\n");  
  19.     //fwrite($file,var_export($job,TRUE)."\n");  
  20.     fwrite($file,$workload."\n");  
  21.     fwrite($file,$result."\n");  
  22.     fclose($file);  
  23.       
  24.     return $result;                    //返回给调用方的数据  
  25. }  
  26. ?>  
<?php
$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', 4730); //连接job服务器
$worker->addFunction('reverse', 'my_reverse_function');  //注册支持任务及对应函数

while ($worker->work());    //循环等待任务,没有时阻塞,循环体内可以放错误处理
//work内尽量不要出现资源忘记回收情况
//处理任务的回调函数

function my_reverse_function($job)
{
    $workload = $job->workload();   //过来的参数
    $result = strrev($workload);    //运算
    $content = file_get_contents("http://www.google.com");    //加大运算时间
    
    //加入执行日志
    $file = fopen("worker_counter.log","a+");
    fwrite($file,date("Y-m-d H:i:s")."\n");
    //fwrite($file,var_export($job,TRUE)."\n");
    fwrite($file,$workload."\n");
    fwrite($file,$result."\n");
    fclose($file);
    
    return $result;                    //返回给调用方的数据
}
?>


保存退出

  1. # vi /var/www/html/company/gearman/client.php  
# vi /var/www/html/company/gearman/client.php



只要能保证nginx能访问到就可以

  1. <?php  
  2. try{  
  3.     $clientnew GearmanClient();  
  4.     $client->addServer('127.0.0.1', 4730);  
  5.     echo $client->do('reverse''You can do it.'), "\n";  
  6. }catch(Exception $e){  
  7.     print_r($e);  
  8. }  
  9. ?>  
<?php
try{
    $client= new GearmanClient();
    $client->addServer('127.0.0.1', 4730);
    echo $client->do('reverse', 'You can do it.'), "\n";
}catch(Exception $e){
    print_r($e);
}
?>


保存退出

使用tty1运行worker

  1. # php worker.php  
# php worker.php


使用tty2运行client

  1. # php client.php  
  2. .ti od nac uoY  
# php client.php
.ti od nac uoY


输出结果正确

使用浏览器运行client
http://192.168.252.128/company/gearman/client.php
.ti od nac uoY
输出结果正确


下面使用php做异步列队测试:

  1. # vi /var/www/html/company/gearman/worker.php  
# vi /var/www/html/company/gearman/worker.php



 

只要能保证nginx能访问到就可以

  1. <?php  
  2. $workernew GearmanWorker();  
  3. $worker->addServer('127.0.0.1', 4730);  
  4. $worker->addFunction('reverse''my_reverse_function');  
  5.   
  6. while ($worker->work());  
  7.   
  8. function my_reverse_function($job)  
  9. {  
  10.     $workload = $job->workload();  
  11.     $result = strrev($workload);  
  12.     $content = file_get_contents("http://www.google.com");    //加大运算时间  
  13.       
  14.     //加入执行日志  
  15.     $file = fopen("worker_counter.log","a+");  
  16.     fwrite($file,date("Y-m-d H:i:s")."\n");  
  17.     //fwrite($file,var_export($job,TRUE)."\n");  
  18.     fwrite($file,$workload."\n");  
  19.     fwrite($file,$result."\n");  
  20.     fclose($file);  
  21.       
  22.     return $result;  
  23. }  
  24. ?>  
<?php
$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('reverse', 'my_reverse_function');

while ($worker->work());

function my_reverse_function($job)
{
    $workload = $job->workload();
    $result = strrev($workload);
    $content = file_get_contents("http://www.google.com");    //加大运算时间
    
    //加入执行日志
    $file = fopen("worker_counter.log","a+");
    fwrite($file,date("Y-m-d H:i:s")."\n");
    //fwrite($file,var_export($job,TRUE)."\n");
    fwrite($file,$workload."\n");
    fwrite($file,$result."\n");
    fclose($file);
    
    return $result;
}
?>




保存退出

# vi /var/www/html/company/gearman/client.php
只要能保证nginx能访问到就可以

  1. <?php  
  2. try{  
  3.     $client= new GearmanClient();  
  4.     $client->addServer('127.0.0.1', 4730);  
  5.     echo $client->doBackground('reverse', 'You can do it.'), "\n";    //异步只是派发任务,不等待返回结果  
  6. }catch(Exception $e){  
  7.     print_r($e);  
  8. }  
  9. ?>  
<?php
try{
    $client= new GearmanClient();
    $client->addServer('127.0.0.1', 4730);
    echo $client->doBackground('reverse', 'You can do it.'), "\n";    //异步只是派发任务,不等待返回结果
}catch(Exception $e){
    print_r($e);
}
?>




保存退出

使用tty1运行worker

  1. # php worker.php  
# php worker.php




使用tty2查看执行效果

  1. # tail -f /var/www/html/company/gearman/worker_counter.log  
# tail -f /var/www/html/company/gearman/worker_counter.log





使用tty3运行client

  1. # php client.php  
  2. H:localhost:150  
# php client.php
H:localhost:150



表示该操作列队中,我可以在tty2中实时查看到效果

  1. 2014-03-15 06:08:16  
  2. You can do it.  
  3. .ti od nac uoY  
2014-03-15 06:08:16
You can do it.
.ti od nac uoY




使用浏览器运行client
http://192.168.252.128/company/gearman/client.php
H:localhost:153
表示该操作列队中,我可以在tty2中实时查看到效果

  1. 2014-03-15 06:09:44  
  2. You can do it.  
  3. .ti od nac uoY  
2014-03-15 06:09:44
You can do it.
.ti od nac uoY




我们看到了client不管执行任何操作,都会立即得到一个列队ID,剩余的操作交给了worker。
    
详细使用参考文档:
http://wenku.baidu.com/link?url=YDJGOfRtZ9ySNsYqggK6lPhFqaSCsRb9NskUVE5jwpECH7qR58lyY7m3rutAEq1l2Ma--mOHe-o5YE0oJSSTUd16jcABeSwJNdu4V14N16a

  评论这张
 
阅读(926)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018