[转]PHP利用Gearman来处理并行多进程问题

From
: http://www.yuansir-web.com/2013/11/25/php%E5%88%A9%E7%94%A8gearman%E6%9D%A5%E5%A4%84%E7%90%86%E5%B9%B6%E8%A1%8C%E5%A4%9A%E8%BF%9B%E7%A8%8B%E9%97%AE%E9%A2%98/

最近工作中开发的一套系统,其中很多都是需要操作多服务器的,比如需要同时发布数据到2000个服务器上,或者同时向2000个服务器拉取数据。刚开始的解决方案就是单纯用PHP的curl_multi的方式并发处理请求,而且参考了淘宝技术博客的《Rolling
cURL:
PHP并发最佳实践》
,但是由于网络和数据以及各个服务器等等的一些情况导致这种并发处理的响应时间很慢,因为在并发请求的过程中还包括记录日志,处理数据等逻辑,等待处理结果并返回,所以也不能友好的满足后台操作的体验。

现在重新设计一种方案,利Gearman来实现并发的需求。通过Client将请求发送到Gearman的Jobs,在每个Work中来再来进行curl_multi和数据处理和日志等一些操作,同时用Supervisor来监控Gearman以及Works的进程,这样可以实现一个并行的多进程和负载均衡的方案。

Gearman可以做什么

  • 异步处理:图片处理,订单处理,批量邮件/通知之类的

  • 要求高CPU或内存的处理:大容量的数据处理,MapReduce运算,日志聚集,视频编码

  • 分布式和并行的处理

  • 定时处理:增量更新,数据复制

  • 限制速率的FIFO处理

  • 分布式的系统监控任务

Gearman工作原理
使用Gearman的应用通常有三部分组成:一个Client、一个Worker、一个
任务服务器。 Client的作用是提出一个 Job 任务 交给 Job Server 任务服务器。Job Server 会去寻找一个 合适的 Worker
来完成这项任务。Worker 执行由 Client 发送过来的 Job,并且将结果通过 Job Server 返回给 Client。Gearman 提供了
Client 和 Worker 的 API,利用这些API 应用可以同 Gearman Job Server来进行通信。Gearman 内部 Client 和
Worker 之间的通信都是通过 TCP 连接来进行的。

Gearman可以将工作的负载分担到不同的机器中。

安装配置
我只是记录下我安装配置的过程,我在Ubuntu和CentOS中都试了下。
CentOS
YUM 安装





1 rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm





2 yum install
-y gearmand

Ubuntu apt 安装





1 apt-get install
gearman

源码编译





1 yum install
uuid-devel libuuid libuuid-devel uuid boost-devel libevent libevent-devel





2 wget -c https://launchpad.net/gearmand/1.2/1.1.7/+download/gearmand-1.1.7.tar.gz





3 tar zxvf gearmand-1.1.7.tar.gz





4 ./configure --prefix=/usr/local/gearmand





5 make && make
install

安装好以后启动





1 gearmand -d

加上-d参数是表示后台运行,你可以gearmand -h 来查看其它的选项,启动的时候带上其它配置参数





1 /usr/sbin/gearmand --pid-file=/var/run/gearman/gearmand.pid --user=gearman --daemon --log-file=/var/log/gearman-job-server/gearman.log --listen=127.0.0.1

安装PHP
Gearman扩展
我都是用pcel来安装的,你也可以下载源码包来编译安装,但是记得要先安装libgearmanre2c,不然扩展编译安装会出错。





01 pecl install
gearman #不成功并提示版本问题可以试试 pecl install gearman-1.0.3,默认好像是1.1.2





02 1





03 编译安装也很简单





04 1





05 wget -c http://pecl.php.net/get/gearman-1.1.1.tgz





06 tar zxvf gearman-1.1.1.tgz





07 phpize





08 ./configure





09 make && make
install





10 echo "extension=gearman.so"
>> /etc/php.ini

PHP接口函数
Gearman提供很多完善的扩展函数,包括GearmanClient,GearmanJob,GearmanTask,GearmanWorker,具体可以查看PHP官方手册.
这是官方提供的Example其中的一个,相当与一个并发的分发任务处理的例子
gearman_client.php





01 <?php





02  





03 $client = new
GearmanClient();





04 $client->addServer();





05  





06 // initialize the results of our 3 "query results" here





07 $userInfo = $friends
= $posts = null;





08  





09 // This sets up what gearman will callback to as tasks are returned to us.





10 // The $context helps us know which function is being returned so we can





11 // handle it correctly.





12 $client->setCompleteCallback(function(GearmanTask $task, $context) use
(&$userInfo, &$friends, &$posts) {





13 switch ($context)





14 {





15 case ‘lookup_user‘:





16 $userInfo = $task->data();





17 break;





18 case ‘baconate‘:





19 $friends = $task->data();





20 break;





21 case ‘get_latest_posts_by‘:





22 $posts = $task->data();





23 break;





24 }





25 });





26  





27 // Here we queue up multiple tasks to be execute in *as much* parallelism as gearmand can give us





28 $client->addTask(‘lookup_user‘, ‘[email protected]‘, ‘lookup_user‘);





29 $client->addTask(‘baconate‘, ‘[email protected]‘, ‘baconate‘);





30 $client->addTask(‘get_latest_posts_by‘, ‘[email protected]‘, ‘get_latest_posts_by‘);





31  





32 echo "Fetching...\n";





33 $start = microtime(true);





34 $client->runTasks();





35 $totaltime = number_format(microtime(true) - $start, 2);





36  





37 echo "Got user info in: $totaltime seconds:\n";





38 var_dump($userInfo, $friends, $posts);

gearman_work.php





01 <?php





02  





03 $worker = new
GearmanWorker();





04 $worker->addServer();





05  





06 $worker->addFunction(‘lookup_user‘, function(GearmanJob $job) {





07 // normally you‘d so some very safe type checking and query binding to a database here.





08 // ...and we‘re gonna fake that.





09 sleep(3);





10 return ‘The user requested (‘
. $job->workload() . ‘) is 7 feet tall and awesome‘;





11 });





12  





13 $worker->addFunction(‘baconate‘, function(GearmanJob $job) {





14 sleep(3);





15 return ‘The user (‘
. $job->workload() . ‘) is 1 degree away from Kevin Bacon‘;





16 });





17  





18 $worker->addFunction(‘get_latest_posts_by‘, function(GearmanJob $job) {





19 sleep(3);





20 return ‘The user (‘
. $job->workload() . ‘) has no posts, sorry!‘;





21 });





22  





23 while ($worker->work());

我在3个终端中都执行了gearman_work.php





1 [email protected]:~$ ps
aux | grep gearman* | grep -v grep





2 gearman 1504 0.0 0.1 60536 1264 ? Ssl 11:06 0:00 /usr/sbin/gearmand --pid-file=/var/run/gearman/gearmand.pid --user=gearman --daemon --log-file=/var/log/gearman-job-server/gearman.log --listen=127.0.0.1





3 ryan 2992 0.0 0.8 43340 9036 pts/0 S+ 14:05 0:00 php /var/www/gearmand_work.php





4 ryan 3713 0.0 0.8 43340 9036 pts/1 S+ 14:05 0:00 php /var/www/gearmand_work.php





5 ryan 3715 0.0 0.8 43340 9036 pts/2 S+ 14:05 0:00 php /var/www/gearmand_work.php

来查看下执行gearman_work.php的结果shell





1 Fetching...





2 Got user info in: 3.03 seconds:





3 string(59) "The user requested ([email protected]) is 7 feet tall and awesome"





4 string(56) "The user ([email protected]) is 1 degree away from Kevin Bacon"





5 string(43) "The user ([email protected]) has no posts, sorry!"

看到上面的3.03
seconds,说明client请求过去的任务被并行分发执行了。
在实际的生产环境中,为了监测gearmand和work的进程没有被意外退出,我们可以借助Supervisor这个工具,下次我再单独来写个Supervisor的笔记。

[转]PHP利用Gearman来处理并行多进程问题,布布扣,bubuko.com

时间: 2024-08-12 18:29:36

[转]PHP利用Gearman来处理并行多进程问题的相关文章

利用Gearman实现并发查询(Multi-Query)

这个样例是想从数据库查询出几个结果集,一般的做法是,一个接一个的发送查询,然后汇总结果进行输出. 以下我们利用Gearman的gearman_client_run_tasks实现并发的查询,gearman_client_run_tasks接口能够一次性的提交多个任务,然后在callback函数中异步的处理结果. PHP的示比例如以下: The client: <?php $client = new GearmanClient(); $client->addServer(); // initia

PHP并行 多进程/多线程

PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程.fork调用后执行的代码将是并行的. 注:pcntl仅支持linux平台,并且只能在cli模式下使用. $pid = pcntl_fork(); if($pid > 0){ //父进程代码 exit(0); } elseif($pid == 0) { //子进程代码 exit(0); } PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特性,地址是http://pecl.php.net

利用gearman实现redis缓存mysql

环境: centos6.5 mysql5.6 gearman简介: Gearman是一个支持分布式的任务分发框架.设计简洁,获得了非常广泛的支持.一个典型的Gearman应用包括以下这些部分: Gearman Job Server:Gearman核心程序,以守护进程形式运行在后台 Gearman Client:可以理解为任务的收件员,比如我要在后台执行一个发送邮件的任务,可以在程序中调用一个Gearman Client并传入邮件的信息,然后就可以将执行结果立即展示给用户,而任务本身会慢慢在后台运

利用 Gearman 实现系统错误报警功能

Gearman 是什么? Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡.或用来在调用其它语言的函数的系统. Gearman 工作原理 Client(客户端):创建一个Job. Server(服务):找到合适的Worker,把 Job 交给 Worker. Worker(工人):执行Job. Web 中常用的场景. 裁剪图片,生成缩略图. 文件分发(针对用户上传的文件,进行多台服务器分发). 视频转码(对上传的视频,进行转

.Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow

在学习的过程中,看一些一线的技术文档很吃力,而且考虑到国内那些技术牛人英语都不差的,要向他们看齐,所以每天下班都在疯狂地背单词,博客有些日子没有更新了,见谅见谅 什么是TPL? Task Parallel Library (TPL), 在.NET Framework 4微软推出TPL,并把TPL作为编写多线程和并行代码的首选方式,但是,在国内,到目前为止好像用的人并不多.(TPL)是System.Threading和System.Threading.Tasks命名空间中的一组公共类型和API .

多进程(mutiprocessing)与多线程(Threading)之多线程

多线程(threading) 多线程与多进程其实大同小异,他们有很多方法从名字到功能都是一样,比如都有start(),join(),都有守护线程/进程deamon. 一个简单的栗子: import threading import os,time def loop(): for i in range(5): t = threading.Thread(name=str(i)) t.start() print('thread %s is running!'%t.name) print('thread

并发、并行、同步和异步

并发.并行.同步和异步 在学习线程和进程后,对于并行.并发.同步和异步这几个概念我们需要更深层次的了解一下. 串行:同一个时间段只干一件事 并行:同一个时间段可以干多件事 并发 vs 并行 并发是指一个时间段内,有几个程序在用一个CPU上运行,但是任意时刻只有一个程序在CPU上运行.(时间片轮转调度算法) 并行是指任意时刻点上,有多个程序同时运行在多个CPU上,即每个CPU独立运行一段程序. 并行的最大数量和CPU的数量是一致的. 同步 vs异步: 同步是指代码调用IO操作时,必须等待IO操作完

gearman安装

官网:  http://gearman.org/ 一篇文章: 利用Gearman实现异步任务处理 一.问题分析 问题:在性能测试过程中,发现用户管理平台在进行图片上传时,性能不佳. 分析:经过代码分析得知,主要的瓶颈是图片上传后,还需要根据图片组件所在页面模块容器进行一系列处理:图片生成缩略图,裁剪图片,加水印等,这些处理在高并发的情况下,会消耗大量cpu资源,导致系统响应速度非常慢. 旧的处理方式: 次控端调用前台接口进行上传图片后,前台程序先上传图片,接着,进行图片压缩等处理,然后再返回结果

第十章 并行编程

第十章并行编程 最近并行编程(parallel programming)已经不再是相对较晦涩的主题,由只能是专业开发人员精通,变得更为主流,这是因为日益流行多核处理器.在写作本书的时候,想买一台单核处理器 PC 机,已经几乎不可能,双核已是标配,四核处理器也开始出售,而未来几年内这种趋势还将继续完全在意料之中. 在某些程度上,并行编程中的这种兴趣在带动了函数编程的新的兴趣.函数式编程当然不是所有的并行编程问题最佳解决方案(silver bullet,银色子弹),但它可以有助于设计出以并行方式执行