zoukankan      html  css  js  c++  java
  • 尝试用Gearman实现分布式处理(PHP)[转]

    本文需要你已对Gearman有个大致了解。

    顺便再推荐两篇参考文章
    http://hi.baidu.com/thinkinginlamp/blog/item/ff49972b9e7378f3e6cd40aa.html (学学Gearman)
    http://www.ibm.com/developerworks/cn/opensource/os-php-gearman/index.html (用 Gearman 分发 PHP 应用程序的工作负载)

    更多参考大家还是自己google吧:)

     

    先安装任务分发的Job端

    安装Gearman server and library:
    wget http://launchpad.net/gearmand/trunk/0.8/+download/gearmand-0.8.tar.gz
    tar zxf gearmand-0.8.tar.gz
    cd gearmand-0.8
    ./configure
    sudo make
    sudo make install


    中间可能会遇到些问题:
    在./configure的时候,可能会出现缺少libraries的情况,一般是缺少libevent和uuid这两个开发包,安装之。。。

    sudo apt-get install libevent-dev
    sudo apt-get install uuid-dev


    安装完成后再重新配置安装,安装完成后执行
    sudo ldconfig

    因为本试验Client和Worker端都由PHP来实现,所以需要安装php的gearman扩展

    安装Gearman PHP extension:
    wget http://pecl.php.net/get/gearman-0.4.0.tgz
    tar zxf gearman-0.4.0.tgz
    cd gearman-0.4.0
    phpize
    ./configure
    sudo make
    sudo make install


    中间可能遇到的问题:
    找不到phpize命令,phpize在php开发包中,所以要先安装php5-dev

    sudo apt-get install php5-dev

    安装完后,就可以在源码目录中执行phpize生成相关安装配置信息,接着执行后面的./configure等

    make install后,它告诉你一个目录,生成的gearman.so就在那里。

    根据需要考到相应PHP的扩展目录里(因为我直接用系统默认安装的php,它自动生成就在扩展中)


    接下来修改php.ini以使php加载该模块:
    php --ini
    看下php.ini在哪里,sudo vim 修改之,在其中加入
    extension = "gearman.so"

    然后,开始编写client和worker端

    client.php

     

    1. <?php    
    2.   $clientnew GearmanClient();    
    3.   $client->addServer("127.0.0.1", 4730);    
    4.   print $client->do("title""Linvo");    
    5.   print "/n";    
    6. ?>    


    worker.php

     

    1. <?php    
    2.   $workernew GearmanWorker();    
    3.   $worker->addServer("127.0.0.1", 4730);     
    4.   $worker->addFunction("title""title_function");    
    5.   while ($worker->work());    
    6.        
    7.   function title_function($job)    
    8.   {    
    9.     $str = $job->workload();    
    10.     return strlen($str);    
    11.   }    
    12. ?>  


    准备工作已经完毕,试验开始
    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也可以开启多个,以避免单点故障

  • 相关阅读:
    NodeJS3-1基础API----Path(路径)
    NodeJS2-6环境&调试----debug
    NodeJS2-5环境&调试----process(进程)
    NodeJS2-4环境&调试----global变量
    NodeJS2-3环境&调试----module.exports与exports的区别
    短视频秒播优化实践(二)
    短视频秒播优化实践(一)
    仿抖音上下滑动播放视频
    带着问题,再读ijkplayer源码
    上班一个月,后悔当初着急入职的选择了
  • 原文地址:https://www.cnblogs.com/jking10/p/3413885.html
Copyright © 2011-2022 走看看