• gearmand 编译 could not find gperf


    安装步骤:

    #wget https://launchpad.net/gearmand/1.2/1.1.8/+download/gearmand-1.1.8.tar.gz
    #tar zxvf gearmand-1.1.8.tar.gz
    #cd gearmand-1.1.8
    #./configure
    

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

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

    解决办法:

    # yum search boost
    # yum install boost.x86_64
    # yum install boost-devel.x86_64
    

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

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

    解决办法:

    #yum search gperf
    #yum install gperf.x86_64
    

    再次执行成功

    #make 
    #make install
    

    检测是否安装成功

    #gearman
    

    出现以下错误

    gearman: error while loading shared libraries: libgearman.so.8: cannot open shared object file: No such file or directory
    

    这表示系统不知道libgearman.so.8 放在哪个目录下。 要在/etc/ld.so.conf中加入libgearman.so.8所在的目录。 检查了下,文件所在目录为/usr/local/lib,且该目录在/etc/ld.so.conf文件中。 因此出现这个问题的原因是libgearman.so.8刚生成,没有加入到ld.so.cache中,所以这时需要重新运行一下 /sbin/ldconfig( ldconfig命令的作用)

    再次运行gearman命令

    #gearman
    gearman Error in usage(No Functions were provided).
    
    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安装成功!

    Gearman PHP扩展安装

    #wget http://pecl.php.net/get/gearman-1.1.1.tgz
    #tar zxvf gearman-1.1.1.tgz
    #phpize
    #./configure --with-php-config=/usr/local/php/bin/php-config
    #make 
    #make install
    

    修改php.ini文件,将extension = gearman.so添加到配置文件,用php -m | grep gearman检查扩展是否安装成功

    Gearman使用方法(原文地址)

    编写client和worker端 client.php

    <?php
    $client= new GearmanClient();
    $client->addServer(“127.0.0.1″, 4730);
    print $client->do(“title”, “Linvo”);
    print “
    ”;
    ?>
    

    worker.php

    <?php
    $worker= new GearmanWorker();
    $worker->addServer(“127.0.0.1″, 4730);
    $worker->addFunction(“title”, “title_function”);
    while ($worker->work());
    function title_function($job)
    {
    $str = $job->workload();
    return strlen($str);
    }
    ?>
    

    准备工作已经完毕,试验开始
    1、启动job
    gearmand -d
    2、启动worker
    php -c /etc/php5/apache2/php.ini worker.php
    3、启动client(新开终端中打开)
    php -c /etc/php5/apache2/php.ini client.php
    屏幕显示字符串的长度 “5”
    这里,有几点需要说明一下:
    1、这里直接用php cli方式运行,添加-c参数是为了加载php.ini配置文件,以加载gearman扩展
    2、worker应该做成守护进程(CLI模式),可以开启多个,这样client发起的任务就会分发到各个worker分别来执行(自动负载均衡)
    这个例子由于太过简单,即使开启多个worker也无法看出效果,不过可以通过终止其中一个,可以看出系统自动切换到其他worker继续正常执行
    3、同理,client也是可以开启多个的(模型请参考之前的那边日志)
    4、同时,job也可以开启多个,以避免单点故障

    简易实作

    接下来,我们可以试着用 PHP API 来连接 Job Server 。前面安装好 PECL 的 Gearman Extension 后,我们就可以在 PHP 程式裡建立操作 Gearman API 的物件了。

    以下我用简单的方式来模拟 Client 和 Worker 的运作,所以这裡 Client 和 Worker 会在同一部主机上,但实际运作时是不需要的,请大家注意。

    Client 端程式

    <?php
    $client= new GearmanClient();
    $client->addServer("127.0.0.1", 4730);
    $who = array('who_send'=>'web','get_email'=>'');
    $img['image'] = '/var/www/pub/image/test.png';
    print $client->do("sendEmail", serialize($who));
    print "
    ";
    print $client->do("resizeImage", serialize($img));
    print "
    ";
    ?>
    
    Worker 端程式
    
    <?php
    $worker = new GearmanWorker();
    $worker->addServer(); // 预设为 localhost
    $worker->addFunction('sendEmail', 'doSendEmail');
    $worker->addFunction('resizeImage', 'doResizeImage');
    
    while($worker->work()) {
        sleep(1); // 无限回圈,并让 CPU 休息一下
    }
    
    function doSendEmail($job)
    {
        $data = unserialize($job->workload());
        print_r($data);
        sleep(3); // 模拟处理时间
        echo "Email sending is done really.
    
    ";
    }
    
    function doResizeImage($job)
    {
        $data = unserialize($job->workload());
        print_r($data);
        sleep(3); // 模拟处理时间
        echo "Image resizing is really done.
    
    ";
    }
    

    首先, PHP Gearman Extension 提供了一个名为 GearmanClient 的类别,它可以让程式安排工作给 Job Server 。

    而 addServer 方法表示要通知的是哪些 Job Server ,也就是说如果有多台 Job Server 的话,就可以透过 addServer 新增。

    然后我们将要呼叫哪个 Worker 以及该 Worker 所需要的资料,利用 GearmanClient 的 doBackground 方法传送过去。 doBackground 方法顾名思义就是在背景执行, Client 在丢出需求后就可以继续处理其他的程式,也就是我们常说的「射后不理」。

    doBackground 方法的第一个参数是告诉 Job Server 要执行哪个功能,而这个功能则是由 Worker 提供的;要注意是,这个参数只是识别用的,并不是真正的函式名称。而第二个参数是要传给 Worker 的资料,它必须是个字串;因此如果要传送的是阵列的话,我们就要用 PHP 的 serialize 函式来对这些资料做序列化。

    PHP 的 Gearman Extension 也提供了一个 GearmanWorker 类别,让我们可以实作 Worker 。而 GearmanWorker 类别也提供了addServer 方法,让所生成的 Worker 物件可以注册到 Job Server 中。

    另外 GearmanWorker 类别也提供了 addFuncton 方法,告诉 Job Server 自己可以处理哪些工作。 addFunction 的第一个参数就是对应到 GearmanClient::doBackground 方法的第一个参数,也就是功能名称;这使得 Client 和 Worker 能透过这个名称来互相沟通。而第二个参数则是一个callback函式,它会指向真正应该要处理该工作的函式或类别方法等。

    最后因为 Worker 因为要随时准备服务,是不能被中断的,因此我们透过一个无限迴圈来让它常驻在 Job Server 中。

    测试

    准备好 Client 和 Worker 的程式后,就可以测试看看了。首先我们必须得先执行 worker.php ,让它开始服务。

    php worker.php

    这时我们会看到 worker.php 停驻在等待服务。

    接着我们开启另一个 console 视窗来执行 client.php :

    切换到执行 worker.php 的 console 时,就会看到以下执行结果:

    Array
    (
        [who_send] => web
        [get_email] => 
    )
    Email sending is really done.
    
    Array
    (
        [image] => /var/www/pub/image/test.png
    )
    Image resizing is really done.
    

    这表示 Worker 正常地处理 Client 的需求了。

    现在试着把 worker.php 停掉 (Ctrl+C) ,然后再执行 client.php ,大家应该会发现 client.php 还是正常地完成它的工作;这是因为 Job Server 帮我们把需求先放在 Queue 裡,等待 Worker 启动后再处理。

    这时可以查看 MySQL 的 gearman 资料库,在 gearman_queue 资料表中应该就会看到以下结果:

    这表示 Job Server 成功地将 Queue 保留在 MySQL 资料表中。

    接着再执行 worker.php ,这时 Job Server 会得知 Worker 复活,赶紧将 Queue 裡面属于该 Worker 应该执行的工作再发送出去以完成作业;而 Worker 完成作业后, Job Server 就会把 Queue 清空了。

    Message Queue 这个架构的应用可以说相当广泛,尤其在大流量的网站上,我们能透过它来来有效运用分散式的系统架构,以处理更多使用者的需求。

    而目前 Gearman 可说是在 PHP 上一个很棒的 Message Queue 支援套件,而且 API 也相当完善;因此如果能善用 Gearman 的话,那么我们在 PHP 网站的架构上就可以有更大的延展性,也能有更多的可能性。

  • 相关阅读:
    OpenCV图像数字化
    Matplotlib从兴趣到实践
    NumPy矩阵
    NumPy排序
    NumPy统计函数
    NumPy算输符
    产品路线图详解:主要功能、常见类型和线路图构建技巧
    敏捷和DevOps:是敌是友?
    如何让Git适应敏捷开发流程?
    如何让敏捷中的每日站会发挥最大效果?
  • 原文地址:https://www.cnblogs.com/youlechang123/p/3382425.html
Copyright © 2020-2023  润新知