• Gearman安装+php邮件推送例子


    Gearman是一个处理分布式过程通信的健壮系统。它提供了一个通用的应用程序框架,主要用来把任务转发给

    到其他机器或进程。使用Gearman 能让程序实现并行工作、负载均衡和跨语言调用。它能够用于不同类型

    的应用程序,从高可用的web站点到数据库复制传输,下面是Gearman的一些 优势。

    • 开源 - 免费
    • 多语言支持 - 支持多种语言,而且会越来越多,也实现在客户端用A语言提交任务,Worker端用B语言进行处理。
    • 灵活 - 不用受制于特定的模式,可以快速实现应用的集成。
    • 快速 - Gearman协议简单,并且有经过优化的C语言实现的Server,可以最小化应用程序的开销。
    • 可内嵌 - 由于Gearman 快速且轻量,所以适用于于各种规模的程序,可以以最小的代价引入已经存在的应用程序。
    • 没有单点失败 - Gearman不仅带来伸缩性,也带来更好的容错性。

    在ubuntu下搭建gearman步骤如下:

    1:下载gearman安装包,最新版本的编译失败,要升级一些依赖包,这里测试玩玩 所以安装个低点地版

    本: wget http://launchpad.net/gearmand/trunk/0.13/+download/gearmand-0.13.tar.gz

    2:安装依赖包 apt-get install uuid-dev libevent-dev

    3:编译安装gearmand

    tar xvzf gearmand-0.13.tar.gz
    
    cd gearmand-0.13
    
    ./configure 
    
    make
    
    make install 
    4:安装gearman php扩展,pecl install gearman-0.7.0
    

    5:添加模块

    vi  /etc/php5/apache2/php.ini
    extension = gearman.so 
    然后在phpinfo中验证是否加载。
    
    6:启动gearmand job server守护程序 
    /usr/local/sbin/gearmand -d -u nobody 
    
    7:查看进程是否开启,netstat -antup|grep gearmand 

    tcp6 0 0 :::4730 :::* LISTEN 8108/gearmand
    安装时常见的问题有:

    1.configure: error: no acceptable C compiler found in $PATH

    解决:sudo apt-get update

    sudo apt-get upgrade

    sudo apt-get install gcc

    2.configure: error: No working C++ Compiler has been found. gearmand requires a C+

    解决:sudo apt-get install gcc build-essential g++ rpm

    3.configure: error: cannot find Boost headers version >= 1.37.0

    解决:sudo wget http://connie.slackware.com/~alien/slackbuilds/boost/build/boost_1_38_0.tar.bz2

    sudo tar -xjvf boost_1_38_0.tar.bz2

    sudo make

    sudo make install

    4.configure: error: libevent is required for gearmand. On Debian this can be found in libevent-dev. On RedHat this can be found in libevent-devel.

    解决::sudo apt-get install libevent-dev

    5.configure: error: Couldn't find uuid/uuid.h. On Debian this can be found in uuid-dev. On Redhat this can be found in e2fsprogs-devel.

    解决: sudo apt-get install uuid-dev

    下面是一个PHP实例具体API和更多例子可以在PHP手册上gearmanAPI找到(PHP手册上例子真的很详细,

    本来还想玩玩C的API来试着写下服务端,无奈官网上C的API部分没有work部分的例子,只有安装包中有个

    example结果还编译失败):

    模拟做一个邮件推送
    client.php:

    01 <?php
    02 #create our client object.
    03 $gmclient= new GearmanClient();
    04  
    05 # Add default server (localhost).
    06 $gmclient->addServer("127.0.0.1",4730);#这里是通知一个worker来处理任务,worker可以在不同的地方,实现分布式和负载均衡。
    07  
    08 echo "Begin to Send mail\n";
    09 $mail=array(
    10 'username'=>'cyrec',
    11 'mailto'=>'i@cyrec.org',
    12 'text'=>'this is a test'
    13 );#当然邮件的内容可以通过post到这个脚本来获取。
    14 # Send mail
    15 do
    16 {
    17 $result = $gmclient->do("SendMail", serialize($mail));#因为gearman协议只支持字符串地参数传递,所以如果是数组或者其他类型的参数要序列化传参。
    18  
    19 # Check for various return packets and errors.
    20 #这下面是官方例子中的一段,主要是可以通过接受返回地状态码来执行相应地逻辑
    21 switch($gmclient->returnCode())
    22 {
    23 case GEARMAN_WORK_DATA:
    24 echo "Data: $result\n";
    25 break;
    26 case GEARMAN_WORK_STATUS:
    27 list($numerator, $denominator)= $gmclient->doStatus();
    28 echo "Status: $numerator/$denominator complete\n";
    29 break;
    30 case GEARMAN_WORK_FAIL:
    31 echo "Failed\n";
    32 exit;
    33 case GEARMAN_SUCCESS:
    34 echo "Mail Send Success!";
    35 break;
    36 default:
    37 echo "RET: " . $gmclient->returnCode() . "\n";
    38 exit;
    39 }
    40 }
    41 while($gmclient->returnCode() != GEARMAN_SUCCESS);
    42 ?>

    worker.php:

    01 <?php
    02 echo "Starting\n";
    03 # Create our worker object.
    04 $gmworker= new GearmanWorker();
    05 # Add default server (localhost).
    06 $gmworker->addServer("127.0.0.1",4730);#这里可以添加多个服务端,比如在不同的地方有同样的服务,gearman会自动选择空间的worker来作业。
    07 $gmworker->addServer("127.0.0.2",4730);
    08  
    09 # Register function "reverse" with the server.
    10 $gmworker->addFunction("SendMail", "SendMail");
    11  
    12 print "Waiting for job...\n";
    13 while($gmworker->work())#worker开始永不停止(除非手动ctrl+c)的接受client的任务
    14 {
    15 if ($gmworker->returnCode() != GEARMAN_SUCCESS)
    16 {
    17 echo "return_code: " . $gmworker->returnCode() . "\n";
    18 break;
    19 }
    20 }
    21  
    22 function SendMail($job)
    23 {
    24 $mail = unserialize($job->workload());
    25 print_r($mail);
    26 #接下来就是用phpmailer来发送邮件内容。虚拟机下没有这个类就不写了,大概逻辑就这样。
    27 }
    28 ?>

    然后运行worker,和client:

    php -c /etc/php5/apache2/php.ini /var/www/worker.php #要加载配置执行否则命令模式下没有加载拓展

    php -c /etc/php5/apache2/php.ini /var/www/client.php

    运行结果如下:
    13.png
     
    这样就可以将一些费资源比如图片转换,发邮件等的操作放到另一台服务器上,通过gearman实现分布式。
  • 相关阅读:
    SQL Server中查询结果拼接遇到的小问题
    Java中的类加载器----ClassLoader
    Struts2中的namespace使用
    Windows 8.1激活问题
    Zuul的使用,路由访问映射规则
    hystrixDashboard(服务监控)
    Hystrix(服务熔断,服务降级)
    POI 操作 excel表格 (简单整理)
    Feign的介绍和使用
    自定义Ribbon的负载均衡策略
  • 原文地址:https://www.cnblogs.com/youlechang123/p/3131751.html
Copyright © 2020-2023  润新知