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

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