gearman

作者: 程序员的自我修养 | 来源:发表于2020-05-27 08:47 被阅读0次

gearman异步队列安装流程

必备条件:你的centos需要提前安装了lnmp,如果没有安装可以参照教程:

基础安装包 

[plain] view plain copy

 print?

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

 print?

# 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

 print?

* 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

 print?

#  make  

#  make install  

安装gearman php 扩展

[plain] view plain copy

 print?

# 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

 print?

; Enable gearman extension module  

extension=gearman.so  

[plain] view plain copy

 print?

# service php-fpm restart  

错误解决

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

[plain] view plain copy

 print?

checking for Boost headers version >= 1.39.0… no  

configure: error: cannot find Boost headers version >= 1.39.0  

解决办法: 

[plain] view plain copy

 print?

# yum search boost  

# yum install boost.x86_64  

# yum install boost-devel.x86_64  

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

[plain] view plain copy

 print?

checking for gperf... no  

configure: error: could not find gperf  

解决办法: 

[plain] view plain copy

 print?

#yum search gperf  

#yum install gperf.x86_64  

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

[plain] view plain copy

 print?

checking test for a working libevent... no  

configure: error: Unable to find libevent  

解决办法: 

[plain] view plain copy

 print?

# yum install libevent libevent-devel  

gearman 参数说明

[plain] view plain copy

 print?

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 &  

相关文章

  • Gearman使用

    Gearman 的安装和使用 官网地址:http://gearman.org/ 介绍 Gearman是一个用来把工...

  • gearman

    gearman异步队列安装流程 必备条件:你的centos需要提前安装了lnmp,如果没有安装可以参照教程: 基础...

  • 利用 Gearman 实现系统错误报警功能

    Gearman 是什么? Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的...

  • Gearman-Monitor

    https://github.com/yugene/Gearman-Monitor 安装composer nign...

  • centos 7 部署Gearman和Gearman-Monit

    vim /etc/sysconfig/network-scripts/ifcfg-ens33 service ne...

  • Gearman入门及使用(JAVA调用)

    前言因为新公司用了这个框架做任务分发,所以我才有机会知道并学习!那么Gearman到底是个什么样子的框架或系统呢?...

  • Gearman任务管理服务器

    随着系统的膨胀,越来越多的以来后台各种服务。前期用个队列或者后台定时任务啥的足以搞定。但是随着服务增多,管理和升级...

  • gearman PHP7扩展安装

    注:官方提供的只支持PHP 6,需要第3方支持,https://github.com/wcgallego/pecl...

  • Centos7-Gearmand & PHP gearman 扩

    1. 安装Gearmand yum 安装gearmand 设置自启动 启动gearmand 2. 安装 PHP g...

  • Gearman——分布式任务分发框架

    工作中我们有时候会遇到比如需要同时发布数据到多个个服务器上,或者同时处理多个任务。可以使用PHP的curl_mul...

网友评论

      本文标题:gearman

      本文链接:https://www.haomeiwen.com/subject/ofkuohtx.html