Loading... # [用Gearman实现PHP的分布式处理](https://blog.p2hp.com/archives/1429) 本机环境:Debian6 .0+ PHP5.3.3-7+squeeze1 先安装任务分发的Job端 安装Gearman server and library最新0.20版: wget http://launchpad.net/gearmand/trunk/0.20/+download/gearmand-0.20.tar.gz tar zxf gearmand-0.20.tar.gz cd gearmand-0.20 ./configure sudo make sudo make install 中间可能会遇到些问题: 在./configure的时候,可能会出现缺少libraries的情况: checking for libevent… no configure: error: cannot find the flags to link with Boost program_options 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. 可能系统缺少libboost、libevent和uuid等等,需要依次安装: sudo apt-get install libboost-program-options-dev 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.7.0.tgz tar zxf gearman-0.7.0.tgz cd gearman-0.7.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 <?php $client= new GearmanClient(); $client->addServer(“127.0.0.1″, 4730); print $client->do(“title”, “Linvo”); print “\n”; ?> 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也可以开启多个,以避免单点故障 最后修改:2023 年 08 月 08 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏
1 条评论
博主真是太厉害了!!!