用 Gearman 分发 PHP 应用程序的工作负载
简介: 通过本文,了解工作分发系统 Gearman 并分发用 PHP、C、Ruby 及其他受支持语言编写的应用程序的工作负载。
尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面。如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应。实际上,将一个计算密集型的或专门化的功能放在一个或多个独立的专用服务器上运行,效果会更好。
PHP 的 Gearman 库能把工作分发给一组机器。Gearman 会对作业进行排队并少量分派作业,而将那些复杂的任务分发给为此任务预留的机器。这个库对 Perl、Ruby、<font face="Courier New" size="2">C</font>
、Python 及 PHP 开发人员均可用,并且还可以运行于任何类似 UNIX® 的平台上,包括 Mac OS X、 Linux® 和 Sun Solaris。
向一个 PHP 应用程序添加 Gearman 非常简单。假设您将 PHP 应用程序托管在一个典型的 LAMP 配置上,那么 Gearman 将需要一个额外的守护程序以及一个 PHP 扩展。截止到 2009 年 11 月,Gearman 守护程序的最新版本是 0.10,并且有两个 PHP 扩展可以用 — 一个用 PHP 包裹了 Gearman <font face="Courier New" size="2">C</font>
库,另一个用纯 PHP 编写。我们要用的是前者。它的最新版本是 0.6.0,可以从 PECL 或 Github获取它的源代码。
请注意:对于本文而言,producer 指的是生成工作请求的机器;consumer 是执行工作的机器;而 agent 则是连接 producer 与适当 consumer 的中介。
安装 Gearman
向一个机器添加 Gearman 需要两步:第一步构建并启动这个守护程序,第二步构建与 PHP 版本相匹配的 PHP 扩展。这个守护程序包包括构建此扩展所需的所有库。
首先,下载 Gearman 守护程序 <font face="Courier New" size="2">gearmand</font>
的最新源代码,解压缩这个 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 |
安装 <font face="Courier New" size="2">gearmand</font>
后,构建 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 文件(可以通过 <font face="Courier New" size="2">php --ini</font>
命令快速找到这个文件),然后添加代码行 <font face="Courier New" size="2">extension = gearman.so</font>
:
$ php --ini Loaded Configuration File: /etc/php/php.ini $ vi /etc/php/php.ini ... extension = gearman.so |
保存此文件。要想验证扩展是否启用,请运行 <font face="Courier New" size="2">php --info</font>
,然后查找 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 库的版本号相匹配,那么系统就已准备好了。