用Gearman分发PHP应用程序的工作负载
文章来源:PHP开发学习门户
地址:http://www.phpthinking.com/archives/518
虽然一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体如今若干专有服务或算法方面。假设这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web server对传入的请求没有响应。实际上,将一个计算密集型的或专门化的功能放在一个或多个独立的专用server上执行。效果会更好。
经常使用的缩略词
- API:应用程序编程接口
- HTTP:超文本传输协议
- LAMP:Linux、Apache、MySQL 与 PHP
PHP 的 Gearman 库能把工作分发给一组机器。Gearman 会对作业进行排队并少量分派作业。而将那些复杂的任务分发给为此任务预留的机器。
这个库对 Perl、Ruby、C、Python
 及 PHP 开发者均可用。而且还能够执行于不论什么类似 UNIX® 的平台上,包含 Mac OS X、 Linux® 和 Sun Solaris。
向一个 PHP 应用程序加入 Gearman 很easy。如果您将 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:
- 启动这个 agent,即 Gearman 守护程序:
$ sudo /usr/sbin/gearmand --daemon 
- 用命令行有用工具 gearman执行一个 worker。这个 worker 
 须要一个名字并能执行不论什么命令行有用工具。比如,能够创建一个 worker 来列出某个文件夹的内容。-f參数命名了该
 worker 所提供的函数:$ gearman -w -f ls -- ls -lh 
- 最后的一个代码块是一个 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 或很多其它的server上使用 Gearman 每天处理 600 万个作业。
新闻聚合器 Digg 也已构建了一个同样规模的 Gearman 网络,每天可处理 400,000 个作业。
用Gearman分发PHP应用程序的工作负载的更多相关文章
- 用 Gearman 分发 PHP 应用程序的工作负载【转载】
		通过本文,了解工作分发系统 Gearman 并分发用 PHP.C.Ruby 及其他受支持语言编写的应用程序的工作负载. 尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体 ... 
- 用 Gearman 分发 PHP 应用程序的工作负载
		尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面.如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应.实 ... 
- 【转】在企业内部分发 iOS 应用程序
		(via:破船之家,原文:Provision iOS IPA App for In-House Enterprise Distribution) 在企业内部分发 iOS 应用程序非常复杂.经过努力 ... 
- 转:尝试用Gearman实现分布式处理(PHP)
		原文来自于http://blog.csdn.net/fdipzone/article/details/7166520 本文需要你已对Gearman有个大致了解. 顺便再推荐两篇参考文章http://h ... 
- [Link]Gearman分布式任务处理系统
		http://blog.csdn.net/jiao_fuyou/article/category/1745977 http://www.cnblogs.com/cocowool/archive/201 ... 
- Gearman的使用
		对于分布式网络环境或者有大量任务的应用,我们需要将任务在不同的服务器之间进行分布,这个时候正好是Gearman发挥实力的时候.虽然我们也可以使用MQ队列再加一些自己实现的调度算法来将任务进行分发,但是 ... 
- 尝试用Gearman实现分布式处理(PHP)[转]
		本文需要你已对Gearman有个大致了解. 顺便再推荐两篇参考文章http://hi.baidu.com/thinkinginlamp/blog/item/ff49972b9e7378f3e6cd40 ... 
- 分布式任务分发框架Gearman教程和PHP实现实例
		1.Gearman介绍和使用场景 Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完 ... 
- 分布式的任务分发框架-Gearman
		官方文档:http://gearman.org/getting-started/ 安装方法和示例都有,可以详细看一下. Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,G ... 
随机推荐
- 无耻之徒(美版)第一季/全集Shameless US迅雷下载
			第一季 Shameless Season 1 (2011)看点:本以为美版<无耻之徒>(Shameless)是小众剧(诸多儿童不宜),但是试播集98.2万的收视人次竟然创下了Showtim ... 
- 实习医生格蕾第一季/全集Grey’s Anatomy迅雷下载
			第一季 Grey's Anatomy Season 1 (2005)看点:欢迎来到格雷斯医院,哈佛医学院西区最艰苦的外科住院医实习程序,医务新人最残酷的训练场.Meredith.Izzie和Chris ... 
- 关于 as 播放器的记录
			一:文件结构 1:代码 2:编译后 二:IDE展示区 1处还有6个层,2处为代码和设计文件,3处是主类. 资源文件的位置如下: 三:数据交互 AS中代码: JS中代码: 更多需要注意的地方在这 ... 
- linux rename命令批量修改文件名
			修改文件名可以用mv命令来实现 mv filename1 filename2 1 但如果批量修改还是使用rename命令更为方便 现在我们有a b c d 四个文件 增加后缀 rename 's/$/ ... 
- iCOM组件(iComponent,应用或学习组件)
			iCOM(英文全称:i + component,应用或学习组件,或iCOM组件),为学习资源的一种表现形式,是面向不同类型的学习对象(某一知识点或某一类知识点,如词汇.句子)专门开发的.在外部可重用的 ... 
- git如何上传所有的新文件  gitlab如何上传所有的新文件  git本地覆盖服务器 强制本地覆盖服务器
			原文地址: https://blog.csdn.net/qq_28093585/article/details/78749153 目的描述:新建的git项目,项目中有许多要从本地上传到git仓库的新 ... 
- mysql deadlock found when trying to get lock 问题排查
			mysql deadlock found when trying to get lock 问题排查 1 获 取锁等待情况 可以通过检查 table_locks_waited和table_locks_i ... 
- maskrcnn_benchmark代码分析(1)
			可以先参考:Faster-RCNN代码+理论——1/2 Object Detection and Classification using R-CNNs 使用ipdb调试 try: import ip ... 
- Linux下配置nfs并远程挂载
			nfs是网络文件系统,允许一个节点通过网络访问远程计算机的文件系统,远程文件系统可以被直接挂载到本地,文件操作和本地没有区别,如果是局域网的nfs那么io的性能也可以保证,下面就以CentOS 7.x ... 
- MFC中设备描述表dc的使用
			以下代码我是在View类中实现的: /** 利用平台SDK实现画线功能 // 首先获得窗口的设备描述表 HDC hdc; hdc = ::GetDC( m_hWnd ); //调用的是平台SDK的成员 ... 
