用Gearman分发PHP应用程序的工作负载

文章来源:PHP开发学习门户

地址:http://www.phpthinking.com/archives/518

尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面。如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应。实际上,将一个计算密集型的或专门化的功能放在一个或多个独立的专用服务器上运行,效果会更好。

常用的缩略词

  • API:应用程序编程接口
  • HTTP:超文本传输协议
  • LAMP:Linux、Apache、MySQL 与 PHP

PHP 的 Gearman 库能把工作分发给一组机器。Gearman 会对作业进行排队并少量分派作业,而将那些复杂的任务分发给为此任务预留的机器。这个库对 Perl、Ruby、C、Python
及 PHP 开发人员均可用,并且还可以运行于任何类似 UNIX? 的平台上,包括 Mac OS X、 Linux? 和 Sun Solaris。

向一个 PHP 应用程序添加 Gearman 非常简单。假设您将 PHP 应用程序托管在一个典型的 LAMP 配置上,那么 Gearman 将需要一个额外的守护程序以及一个 PHP 扩展。截止到 2009 年 11 月,Gearman 守护程序的最新版本是 0.10,并且有两个 PHP 扩展可以用 — 一个用 PHP 包裹了 Gearman C 库,另一个用纯
PHP 编写。我们要用的是前者。

请注意:对于本文而言,producer 指的是生成工作请求的机器;consumer 是执行工作的机器;而 agent 则是连接
producer 与适当 consumer 的中介。

安装 Gearman

向一个机器添加 Gearman 需要两步:第一步构建并启动这个守护程序,第二步构建与 PHP 版本相匹配的 PHP 扩展。这个守护程序包包括构建此扩展所需的所有库。

首先,下载 Gearman 守护程序 gearmand 的最新源代码,解压缩这个
tarball,构建并安装此代码(安装需要有超级用户的权限,即根用户权限)。

$ wget http://launchpad.net/gearmand/trunk/  0.10/+download/gearmand-0.10.tar.gz
$ tar xvzf gearmand-0.10.tar.gz
$ cd gearmand-0.10
$ ./configure
$ make
$ sudo make install

安装 gearmand 后,构建 PHP 扩展。您可以从 PECL 获取这个
tarball,也可以从 Github 复制该存储库。

$ wget http://pecl.php.net/get/gearman-0.6.0.tgz
$ cd pecl-gearman
#
# or
#
$ git clone git://github.com/php/pecl-gearman.git
$ cd pecl-gearman

有了这些代码后,就可以开始构建扩展了:

$ phpize
$ ./configure
$ make
$ sudo make install

这个 Gearman 守护程序通常被安装在 /usr/sbin。可以从命令行直接启动此守护程序,也可以将这个守护程序添加到启动配置中,以便在机器每次重启时就可以启动这个守护程序。

接下来,需要安装 Gearman 扩展。打开 php.ini 文件(可以通过 php --ini 命令快速找到这个文件),然后添加代码行 extension
= gearman.so

$ php --ini
Loaded Configuration File:         /etc/php/php.ini
$ vi /etc/php/php.ini
...
extension = gearman.so

保存此文件。要想验证扩展是否启用,请运行 php --info,然后查找
Gearman:

$ php --info | grep "gearman support"
gearman
gearman support => enabled
libgearman version => 0.10

此外,还可以用一个 PHP 代码片段来验证构建和安装是否得当。将这个小应用程序保存到 verify_gearman.php:

<?php
  print gearman_version() . "\n";
?>

接下来,从命令行运行此程序:

$ php verify_gearman.php
0.10

如果这个版本号与之前构建和安装的 Gearman 库的版本号相匹配,那么系统就已准备好了。

运行 Gearman

我们前面提到过,一个 Gearman 配置有三个角色:

  • 一个或多个 producer 生成工作请求。每个工作请求命名它所想要的函数,例如 email_all 或 analyze
  • 一个或多个 consumer 完成请求。每个 consumer 命名它所提供的一个或多个函数并向 agent 注册这些功能。一个 consumer 也可以被称为是一个 worker。
  • 代理对与之建立连接的那些 consumer 提供的所有服务进行集中编制。它将 producer 与恰当的 consumer 联系起来。

借助如下的命令行,可以立即体验 Gearman:

  1. 启动这个 agent,即 Gearman 守护程序:

    $ sudo /usr/sbin/gearmand --daemon
  2. 用命令行实用工具 gearman 运行一个 worker。这个 worker
    需要一个名字并能运行任何命令行实用工具。例如,可以创建一个 worker 来列出某个目录的内容。-f 参数命名了该
    worker 所提供的函数:

    $ gearman -w -f ls -- ls -lh
  3. 最后的一个代码块是一个 producer,或用来生成查找请求的一个作业。也可以用 gearman 生成一个请求。同样,用 -f 选项来指定想要从中获得帮助的那个服务:

    $ gearman -f ls < /dev/null
    [email protected] 43 supergiantrobot  staff   1.4K Nov 15 15:07 gearman-0.6.0
    [email protected]  1 supergiantrobot  staff    29K Oct  1 04:44 gearman-0.6.0.tgz
    [email protected]  1 supergiantrobot  staff   5.8K Nov 15 15:32 gearman.html
    [email protected] 32 supergiantrobot  staff   1.1K Nov 15 14:04 gearmand-0.10
    [email protected]  1 supergiantrobot  staff   5.3K Jan  1  1970 package.xml
    drwxr-xr-x  47 supergiantrobot  staff   1.6K Nov 15 14:45 pecl-gearman

从 PHP 使用 Gearman

从 PHP 使用 Gearman 类似于之前的示例,惟一的区别在于这里是在 PHP 内创建 producer 和 consumer。每个 consumer 的工作均封装在一个或多个 PHP 函数内。

清单 1 给出了用 PHP 编写的一个 Gearman worker。将这些代码保存在一个名为 worker.php 的文件中。

清单 1. Worker.php
<?php
  $worker= new GearmanWorker();
  $worker->addServer();
  $worker->addFunction("title", "title_function");
  while ($worker->work());

  function title_function($job)
  {
    return ucwords(strtolower($job->workload()));
  }
?>

清单 2 给出了用 PHP 编写的一个 producer,或 client。将此代码保存在一个名为 client.php 的文件内。

清单 2. Client.php
<?php
  $client= new GearmanClient();
  $client->addServer();
  print $client->do("title", "AlL THE World‘s a sTagE");
  print "\n";
?>

现在,可以用如下的命令行连接客户机与 worker 了:

$ php worker.php &
$ php client.php
All The World‘s A Stage
$ jobs
[3]+  Running                 php worker.php &

这个 worker 应用程序继续运行,准备好服务另一个客户机。

Gearman 的高级特性

在一个 Web 应用程序内可能有许多地方都会用到 Gearman。可以导入大量数据、发送许多电子邮件、编码视频文件、挖据数据并构建一个中央日志设施 — 所有这些均不会影响站点的体验和响应性。可以并行地处理数据。而且,由于 Gearman 协议是独立于语言和平台的,所以您可以在解决方案中混合编程语言。比如,可以用 PHP 编写一个 producer,用 C、Ruby
或其他任何支持 Gearman 库的语言编写 worker。

一个连接客户机和 worker 的 Gearman 网络实际上可以使用任何您能想象得到的结构。很多配置能够运行多个代理并将 worker 分配到许多机器上。负载均衡是隐式的:每个可操作的可用 worker(可能是每个 worker 主机具有多个 worker)从队列中拉出作业。一个作业能够同步或异步运行并具有优先级。

Gearman 的最新版本已经将系统特性扩展到了包含持久的作业队列和用一个新协议来通过 HTTP 提交工作请求。对于前者,Gearman 工作队列保存在内存并在一个关系型数据库内存有备份。这样一来,如果 Gearman 守护程序故障,它就可以在重启后重新创建这个工作队列。另一个最新的改良通过一个 memcached 集群增加队列持久性。memcached 存储也依赖于内存,但被分散于几个机器以避免单点故障。

Gearman 是一个刚刚起步却很有实力的工作分发系统。据 Gearman 的作者 Eric Day 介绍,Yahoo! 在 60 或更多的服务器上使用 Gearman 每天处理 600 万个作业。新闻聚合器 Digg 也已构建了一个相同规模的 Gearman 网络,每天可处理 400,000 个作业。

时间: 2024-12-22 02:23:13

用Gearman分发PHP应用程序的工作负载的相关文章

用 Gearman 分发 PHP 应用程序的工作负载

尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面.如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应.实际上,将一个计算密集型的或专门化的功能放在一个或多个独立的专用服务器上运行,效果会更好. PHP 的 Gearman 库能把工作分发给一组机器.Gearman 会对作业进行排队并少量分派作业,而将那些复杂的任务分发给为此任务预留的机器.这个库对 Perl.Ruby.C.Python 及 PHP 开发

内存管理--分发您的程序存储器

在一个多任务操作系统的每个进程在其自己的沙箱的存储器执行.沙盒是一个虚拟地址空间(virtual address space). 1 32位虚拟内存布局 在32下部模式虚拟地址空间始终是一个4GB内存地址块.这些虚拟地址的页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用. 每个进程拥有一套属于它自己的页表,可是另一个隐情. 仅仅要虚拟地址被使用,那么它就会作用于这台机器上执行的全部软件.包含内核本身.因此一部分虚拟地址必须保留给内核使用: 图 1 这并不意味着内核使用

在企业内部分发 iOS 应用程序

参考:http://www.cocoachina.com/industry/20140818/9401.html http://blog.csdn.net/zhaoxy_thu/article/details/17277527 iOS 9 安装企业包 没有了信任按钮 需要手动设置为信任http://www.cocoachina.com/ios/20150703/12392.html

[Link]Gearman分布式任务处理系统

http://blog.csdn.net/jiao_fuyou/article/category/1745977 http://www.cnblogs.com/cocowool/archive/2011/08/18/2145144.html 参考资料: 1.用 Gearman 分发 PHP 应用程序的工作负载 2.Gearman 3.error while loading shared libraries: libgearman.so.1 4.跨多种环境部署Gearman

转:尝试用Gearman实现分布式处理(PHP)

原文来自于http://blog.csdn.net/fdipzone/article/details/7166520 本文需要你已对Gearman有个大致了解. 顺便再推荐两篇参考文章http://hi.baidu.com/thinkinginlamp/blog/item/ff49972b9e7378f3e6cd40aa.html (学学Gearman)http://www.ibm.com/developerworks/cn/opensource/os-php-gearman/index.htm

分布式的任务分发框架-Gearman

官方文档:http://gearman.org/getting-started/ 安装方法和示例都有,可以详细看一下. Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面. Gearman可以做什么 异步处

分布式任务分发框架Gearman教程和PHP实现实例

1.Gearman介绍和使用场景 Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于LiveJournal的图片 resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面. 通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用WebService的方式来处理此类集成问题,但不

Linux中Gearman安装与使用,分布式消息队列(CentOS-6.5:gearmand-1.1.12)

1 Gearman简介 1.1 概况 Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡.或用来在调用其它语言的函数的系统. 1.2 组成 Gearman是一个分发任务的程序架构,由三部分组成: 1)Gearman client:提供gearman client API给应用程序调用.API可以使用C,PHP,PERL,MYSQL UDF等待呢个语言,它是请求的发起者. 2)Gearman job server:将客户端的请求

Gearman介绍

Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能.它的 任务分布非常 简单,简单得可以只需要用脚本即可完成.Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资 源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面. oschina.net - 任务调度程序 Gearman