`
dcj3sjt126com
  • 浏览: 1877782 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • PHP
阅读更多

尽管一个 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 编写。我们要用的是前者。它的最新版本是 0.6.0,可以从 PECL 或 Github(参见参考资料)获取它的源代码。

请注意:对于本文而言,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
    drwxr-xr-x@ 43 supergiantrobot  staff   1.4K Nov 15 15:07 gearman-0.6.0
    -rw-r--r--@  1 supergiantrobot  staff    29K Oct  1 04:44 gearman-0.6.0.tgz
    -rw-r--r--@  1 supergiantrobot  staff   5.8K Nov 15 15:32 gearman.html
    drwxr-xr-x@ 32 supergiantrobot  staff   1.1K Nov 15 14:04 gearmand-0.10
    -rw-r--r--@  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 个作业。Gearman 的一个出色例子可以在 Narada 这个开源搜索引擎(参见 参考资料)中找到。

Gearman 的未来版本将收集并报告统计数据、提供高级监视和缓存作业结果等。为了跟踪这个 Gearman 项目,可以订阅它的 Google 组,或访问 Freenode 上它的 IRC 频道 #gearman


参考资料

学习

  • 利用 Gearman 站点,了解有关此库的更多信息。 

  • Narada 搜索引擎 是一个开源项目,强调了最新开源技术(包括 Gearman)的使用。 

  • PHP.net 是面向 PHP 开发人员的中心资源。

  • 查阅 “推荐 PHP 读物列表”。 

  • 浏览 developerWorks 上的全部 PHP 内容

  • 查看 IBM developerWorks 的 PHP 项目资源,扩展您的 PHP 技巧。 

  • 收听针对软件开发人员的有趣访谈和讨论,一定要访问 developerWorks podcasts

  • 要将数据库与 PHP 结合使用?查看 Zend Core for IBM,它是一个无缝的、可以立即使用、易于安装、支持 IBM DB2 V9 的 PHP 开发和生产环境。 

  • My developerWorks 涵盖了大量主题,是一个成功社区的典范。

  • 随时关注 developerWorks 技术活动网络广播。 

  • 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动 。

  • 访问 developerWorks Open source 专区 获得丰富的 how-to 信息、工具和项目更新以及 最受欢迎的文章和教程,帮助您用开放源码技术进行开发,并将它们与 IBM 产品结合使用。

  • 查看免费的 developerWorks 演示中心,观看并了解 IBM 及开源技术和产品功能。

获得产品和技术

讨论

分享到:
评论

相关推荐

    php使用gearman进行任务分发操作实例详解

    Gearman是一个工作负载分发服务器和库,允许将工作分散到多个机器或者机器上的多个核心上进行异步处理。它在Web应用程序中处理耗时的后台任务时尤其有用,如文件上传、邮件发送、图片处理等。 2. PHP Gearman扩展...

    Laravel开发-php-gearman

    4. **负载均衡**:Gearman 服务器可以自动进行负载均衡,将任务分发到空闲的 Workers 上。 综上所述,Laravel 结合 PHP Gearman 提供了一个强大而灵活的解决方案,用于处理异步任务和分布式计算,极大地提升了系统...

    Gearman环境搭建资料

    Gearman是一种分布式任务队列系统,它允许应用程序在不同的服务器之间分发工作负载,从而实现负载均衡和异步处理。本篇文章将详细讲解如何在Linux环境中搭建Gearman,包括依赖库的安装和Gearman服务的配置。 首先,...

    GearMAN讲解及所带来的变革

    通过这种方式,GearMAN允许系统将耗时的任务从请求线程中分离出来,以非阻塞的方式处理,从而显著提高了应用程序的响应能力和吞吐量。 GearMAN的主要特点包括多方式支持(支持PHP、Java、Python等多种编程语言)、...

    net_gearman-master.zip

    在PHP的世界里,Gearman是一个强大的分布式任务处理框架,它允许开发者将任务分发到多台服务器上执行,从而实现负载均衡和异步处理。本文将深入探讨net_gearman-master.zip,这是一个专为PHP设计的Gearman客户端插件...

    gearman-1.0.2.tgz

    Gearman 是一个开源的分布式任务队列系统,它允许应用程序将耗时的任务分发到多台机器上异步处理,从而提高系统的响应速度和整体性能。`gearman-1.0.2.tgz` 是 Gearman 的一个特定版本,即 1.0.2 版本的源代码压缩包...

    gearman-0.5.0.tgz(在使用)

    齿轮人(Gearman)是一个开源的分布式任务队列系统,主要设计用于在多台服务器之间分发计算任务,实现负载均衡和并行处理。在 Gearman 的架构中,客户端提交任务到 Gearman 服务器,而工作者(worker)则从服务器...

    Gearman分享PDF

    Gearman是一个分布式任务队列系统,它允许将任务分发到多个工作节点上,同时在这些工作节点间负载均衡和故障转移。这个系统常用于需要处理大量异步任务的场景中,比如发送电子邮件、推送通知、消息传递、导入大型...

    php扩展(gearman.so , memcached.so ,memcache.so ,mongo.so ,redis.so)

    通过将工作分发到多个服务器,Gearman提高了处理大量并发请求的能力。PHP的gearman扩展提供了与Gearman服务器通信的功能,使得开发者能够轻松地创建后台处理任务,提高应用程序的性能和响应速度。 2. Memcached.so...

    gearman-0.8.0.tgz

    齿轮人(Gearman)是一个开源的工作队列系统,它的主要目标是解耦应用程序的不同部分,使得分布式处理变得简单。 Gearman-0.8.0.tgz 是一个包含齿轮人0.8.0版本源代码的压缩包文件。下面将详细探讨齿轮人(Gearman)...

    PHP并发多进程处理利器Gearman使用介绍

    通信是通过 TCP 连接进行的,这使得 Gearman 能够有效地在多台机器之间分发负载。 安装 Gearman 包括两个步骤:首先,需要在服务器上安装 Gearmand 服务,可以通过 RPM 包管理器或者源码编译安装。接着,为了在 ...

    pecl-gearman:libgearmanPHP包装器

    这个扩展的核心目标是让PHP能够无缝地利用Gearman的并行计算能力,提升应用程序的性能和可伸缩性。 **Gearman简介** Gearman是一个开源的、跨平台的框架,用于在分布式环境中分发任务。它允许你将工作负载分散到多...

    gearman开源任务调度系统.pdf

    Gearman 是一个分布式任务分发调度框架,支持多语言、并发的任务执行,支持负载均衡。其主要特点包括: 1. 开源:Gearman 是一个开源的任务调度系统,这使得其可以被自由地使用和修改。 2. 支持多语言接口:Gearman...

    Yii2队列扩展支持DBRedisRabbitMQBeanstalk和Gearman

    Yii2扩展与Gearman的结合,让开发者能够轻松地在多台服务器之间分发工作,提高系统的可伸缩性和可靠性。 Yii2队列扩展提供的这些选项,让开发者可以根据项目需求和现有基础设施选择最适合的队列服务。使用这个扩展...

    gearman中任务的优先级和返回状态实例分析

    这个系统允许将任务分发到多个 worker 进程,以实现负载均衡和并发处理。在本文中,我们将深入探讨 Gearman 任务的两个关键特性:优先级和返回状态。 一、任务的优先级 在 Gearman 中,任务的优先级分为三个级别:...

    开源项目-appscode-g2.zip

    Gearman是一个通用的工作队列系统,它允许应用程序将任务分发到网络中的其他机器上进行异步处理,从而提高系统的并行性和可扩展性。G2作为Gearman的一个现代化实现,旨在提供更高效、更稳定的解决方案。 在了解G2...

    gearmand-1.1.5.tar.gz

    齿轮人(Gearman)是一个开源的工作队列系统,它的主要目标是解耦应用程序中的任务处理,使得异步处理和分布式工作负载成为可能。`gearmand-1.1.5.tar.gz` 是齿轮人(Gearman)1.1.5版本的源代码压缩包,它遵循了...

    分布式图片处理平台解决方案

    Gearman是一种用于分发任务的高性能网络应用,它可以将大量工作分发到多台计算机或多个进程上并行执行,非常适合用于构建分布式图片处理平台。 - **客户端(Client)**:客户端使用PHP+Gearman客户端扩展实现,负责...

Global site tag (gtag.js) - Google Analytics