gearman使用场景
尽管Web应用程序的大部分可能位于表示中,但其价值和竞争优势可能位于少数专有服务或算法中。 如果这种处理复杂或耗时,则最好以异步方式执行,以免Web服务器对传入的请求不响应。 实际上,最好在一个或多个单独的专用服务器上执行特别是计算密集型或专用功能。
PHP的Gearman库将工作分配到一组计算机中。 Gearman将作业排队并分配任务,将繁重的任务分配给为任务预留的机器。 该库可用于Perl,Ruby, C
,Python和PHP开发人员,并且可以在任何类似UNIX®的平台上运行,包括Mac OS X,Linux®和Sun Solaris。
将Gearman添加到PHP应用程序很容易。 假设您在典型的LAMP配置上托管PHP应用程序,那么Gearman需要一个附加的守护程序和一个PHP扩展。 截至2009年11月,Gearman守护程序的最新版本是0.10,并且提供了两个PHP扩展-一个使用PHP包装Gearman C
库,另一个使用纯PHP编写。 本技巧使用前者。 它的最新版本是0.6.0,它的源代码可以从PECL或Github上(请参阅相关的主题 )。
注意:就本文而言, 生产者是生成工作请求的机器, 消费者是执行工作的机器,而代理是将生产者与合适的消费者联系起来的中介。
安装Gearman
将Gearman添加到机器需要两个步骤:构建和启动守护程序,以及构建PHP扩展以匹配您PHP版本。 守护程序包包括构建扩展所需的所有库。
首先,下载gearmand
的最新源代码,Gearman守护程序,解压缩tarball,然后构建并安装代码。 (安装步骤需要超级用户root的特权。)
$ 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配置具有三种角色:
- 一个或多个生产者生成工作请求。 每个工作请求名称就是了功能,如
email_all
或analyze
。 - 一个或多个消费者满足需求。 每个使用者命名其提供的一个或多个功能,并向代理注册这些功能。 消费者也称为工人 。
- 该代理程序将与它联系的消费者提供的所有服务归为一类。 它使生产者与有能力的消费者结婚。
您可以从命令行直接快速试用Gearman:
- 启动代理Gearman守护程序:
$ sudo /usr/sbin/gearmand --daemon
- 使用命令行实用工具
gearman
运行工人。 工作人员需要一个名称,并且可以运行任何命令行实用程序。 例如,您可以创建一个工作程序以列出目录的内容。-f
参数命名工作程序提供的功能:$ gearman -w -f ls -- ls -lh
- 最后一个难题是生产者或生成查询请求的工作。 您也可以使用
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创建生产者和消费者参与者。 每个使用者的工作都封装在一个或多个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编写的生产者或客户 。 将此代码保存在名为client.php的文件中。
清单2. Client.php
<?php
$client= new GearmanClient();
$client->addServer();
print $client->do("title", "AlL THE World's a sTagE");
print "\n";
?>
现在,您可以从命令行将客户端连接到工作程序:
$ php worker.php &
$ php client.php
All The World's A Stage
$ jobs
[3]+ Running php worker.php &
辅助应用程序继续运行,准备为另一个客户端提供服务。
Gearman的高级功能
Web应用程序中Gearman有许多可能的用途。 您可以导入大量数据,发送大量电子邮件,对视频文件进行编码,挖掘数据并构建中央日志工具,而所有这些都不会影响网站的体验和响应能力。 您可以并行处理数据。 此外,由于Gearman协议与语言和平台无关,因此您可以在解决方案中混合使用编程语言。 您可以使用PHP来编写生产器,而可以使用C
,Ruby或可以使用Gearman库的任何语言来编写工作器。
将客户与工人联系起来的Gearman网络几乎可以实现您可以想象的任何形状。 许多配置在多个计算机上运行多个代理并将工作分散。 负载平衡是隐式的:每个可操作且可用的工作程序(可能每个工作程序主机可能有许多工作程序)从队列中拉出作业。 作业可以优先级同步或异步运行。
Gearman的最新版本已扩展了系统的功能,包括持久性作业队列和新协议,可通过HTTP提交工作请求。 对于前者,Gearman工作队列保留在内存中,但由关系数据库支持。 因此,如果Gearman守护程序失败,则它可以在重新启动时重新创建工作队列。 最近的另一项改进是通过内存缓存集群增加了队列持久性。 memcached存储也依赖于内存,但是分布在多台计算机上以防止出现单点故障。
Gearman是一个新生但功能强大的工作分配系统。 根据Gearman作者Eric Day的说法,Yahoo! 在60台或更多服务器上使用Gearman来每天处理600万个工作。 新闻聚合商Digg建立了一个类似规模的Gearman网络,每天可处理40万个工作。 您可以在开源搜索引擎Narada中找到Gearman的详细示例(请参阅参考资料 )。
Gearman的未来版本将收集和报告统计信息,提供高级监视并缓存作业结果等。 要跟踪Gearman项目,请订阅其Google群组,或访问其Freenode上的IRC频道#gearman
。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-php-gearman/index.html
gearman使用场景