2019独角兽企业重金招聘Python工程师标准>>>

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

by yuansir

2013 年 11 月 25 日

Linux, PHP, 开发应用

0

转载请注明: 转载自Yuansir-web菜鸟 | LAMP学习笔记

本文链接地址: PHP利用Gearman来处理并行多进程问题

最近工作中开发的一套系统,其中很多都是需要操作多服务器的,比如需要同时发布数据到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 连接来进行的。

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

cluster

安装配置

我只是记录下我安装配置的过程,我在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来安装的,你也可以下载源码包来编译安装,但是记得要先安装libgearman和re2c,不然扩展编译安装会出错。

01

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

02

03

编译安装也很简单

04

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', 'joe@joe.com', 'lookup_user');

29

$client->addTask('baconate', 'joe@joe.com', 'baconate');

30

$client->addTask('get_latest_posts_by', 'joe@joe.com', '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

ryan@ryan-lamp:~$ 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 (joe@joe.com) is 7 feet tall and awesome"

4

string(56) "The user (joe@joe.com) is 1 degree away from Kevin Bacon"

5

string(43) "The user (joe@joe.com) has no posts, sorry!"

看到上面的3.03 seconds,说明client请求过去的任务被并行分发执行了。

在实际的生产环境中,为了监测gearmand和work的进程没有被意外退出,我们可以借助Supervisor这个工具,下次我再单独来写个Supervisor的笔记。

(转载请标明出处:Yuansir-web菜鸟-LAMP学习笔记:PHP利用Gearman来处理并行多进程问题)

转载于:https://my.oschina.net/yonghan/blog/634286

PHP利用Gearman来处理并行多进程问题相关推荐

  1. 利用gearman实现redis缓存mysql

    环境: centos6.5 mysql5.6 gearman简介: Gearman是一个支持分布式的任务分发框架.设计简洁,获得了非常广泛的支持.一个典型的Gearman应用包括以下这些部分: Gea ...

  2. Android平台利用OpenCL框架实现并行开发初试

    在我们熟知的桌面平台,GPU得到了极为广泛的应用,小到各种电子游戏,大到高性能计算,多核心.高并行化的GPU成为我们日常娱乐和科学研究必不可少的"利器".同样,在近些年兴起的移动平 ...

  3. 利用Gearman,搭建异步分布式计算平台

    Gearman的介绍 主页在http://gearman.org/index.php, 它的主要优点有:1. 实现了异步计算.可以将比较耗时的计算分配到分布式计算集群来减少站点服务器的压力和用户的等待 ...

  4. Java多进程测试用例_Pytest xdist/Pytest并行多进程执行测试用例,pytestxdistpytestparallel...

    如果想分布式执行用例,用例设计必须遵循以下原则: 1.用例之间都是独立的, 2.用例a不要去依赖用例b 3.用例执行没先后顺序, 4.随机都能执行每个用例都能独立运行成功每个用例都能重复运行,不影响其 ...

  5. 【日常】利用代理IP伪装进行多进程爬虫

    最近有些饱暖思淫欲了,对之前爬虫的速度很不满意了.主要是在爬虫速度上的需求问题,如果追求速度就很容易被网站封锁IP:如果追求稳定地爬取只能通过两次访问之间间隔一个随机时间来避免网站对爬虫的封锁,然而这 ...

  6. gearman mysql编译_利用gearman实现redis缓存mysql

    环境: centos6.5 mysql5.6 gearman简介: Gearman是一个支持分布式的任务分发框架.设计简洁,获得了非常广泛的支持.一个典型的Gearman应用包括以下这些部分: Gea ...

  7. Redis集群——利用Gearman在Lnmp架构中做MySQL的缓存服务器

    一.概述 Redis的集群主要是使用切片技术来搭建的,简单来说就是把所有KEY分散存放到不同的redis节点上(不要把鸡蛋都放在一个篮子里). 1. 集群基本原理 Redis集群中内置了16384个槽 ...

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

    在学习的过程中,看一些一线的技术文档很吃力,而且考虑到国内那些技术牛人英语都不差的,要向他们看齐,所以每天下班都在疯狂地背单词,博客有些日子没有更新了,见谅见谅 什么是TPL? Task Parall ...

  9. 利用pycharm简单实现多进程

    python多进程需要使用进程池 from multiprocessing.pool import Poolimport timedef worker(x):print("worker&qu ...

最新文章

  1. 防火墙双机热备三大协议(VRRP-VGMP-HRP)原理
  2. python中国大学排名爬虫写明详细步骤-Python爬虫 2020中国大学排名
  3. C语言中动态数组的作用,C语言实现动态数组
  4. 用CONVERT命令转换FAT到NTFS,合适吗?
  5. ModuleNotFoundError No module named urllib2
  6. isbool php,PHP PHPUnit assertIsBool()用法及代码示例
  7. 介绍几个flash游戏框架
  8. 【渝粤教育】21秋期末考试管理学原理★10013k1
  9. CTO@全体成员,未经允许和评审不让用反射,Java反射到底慢在哪?
  10. SQL2008安装 VS2008安装(VS2010存在的情况下)
  11. 深度系统安装移动硬盘启动_国产操作系统深度(deepin)系统安装教程
  12. html原生的日期选择器,原生JS实现日期选择
  13. 做正确的事和正确的做事的区别
  14. Linux中命令行中EOF的用法
  15. 我国第三方支付行业市场现状和发展趋势(三)
  16. 有那些适合苹果手机用的蓝牙耳机?适合苹果手机用的蓝牙耳机推荐
  17. 计算机网络安全(三)
  18. quickBI嵌入自研系统
  19. 弱小和无知不是生存的障碍,傲慢才是
  20. SSM校园好货APP的设计与实现毕业设计源码121619

热门文章

  1. 微软撤回了开放面部识别数据集,出于法律原因
  2. SAP MM MB21创建预留单据报错- Error during conversion to alternative units of measure -
  3. 流行的14个机器学习编程语言框架和工具
  4. python中一些常用函数和库的介绍(getattr、id、type、sys)
  5. 《神经元》发表脑智卓越中心关于灵活分类决策神经环路机制的研究成果
  6. 群雄逐鹿,谁会赢得自动驾驶之战?
  7. 希尔伯特著名的第六问题 – 原来麦克斯韦早就有解?
  8. 神经元“超级替补”让失明小鼠恢复视力
  9. 宜宾地震,这个系统跑赢了“地震波”!
  10. 定了!5G商用牌照近期发放​​​​,透露两大信息(附:2019年5G行业关键材料及市场研究报告)...