安装过程为:
1. 下载
wget http://launchpad.net/gearmand/trunk/0.26/+download/gearmand-0.26.tar.gz
2. 编译
% tar -xvzf gearmand-0.26.tar.gz
% cd gearmand
% ./configure
3. 安装
% make
% make install
但是在第2步的时候发现了很多编译错误:
- configure: error: no acceptable C compiler found in $PATH
这是说没有装编译器,可以装个GCC或G++ - configure: error: cannot find Boost headers version >= 1.39.0
这是说没有安装boost包或库
4. 最后找了下,所有的依赖包:
sudo apt-get install uuid-dev libevent-dev libboost-all-dev libdrizzle-dev
/** 未遇到
在./configure的时候,可能会出现缺少libraries的情况:
checking for libevent… no
configure: error: cannot find the flags to link with Boost program_options
configure: error: libevent is required for gearmand. On Debian this can be found in libevent-dev. On RedHat this can be found in libevent-devel.
可能系统缺少libboost、libevent和uuid等等,需要依次安装:
sudo apt-get install libboost-program-options-dev
sudo apt-get install libevent-dev
sudo apt-get install uuid-dev
*/
5. 运行./configure 之后出现下面结果:
Configuration summary for gearmand version 0.26 * Installation prefix: /usr/local * System type: pc-linux-gnu * Host CPU: i686 * C Compiler: gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 * Assertions enabled: yes * Debug enabled: no * Warnings as failure: * Building with libsqlite3 no * Building with libdrizzle no * Building with libmemcached no * Building with libp no * Building with tokyocabinet no/** apt-get安装提示有如下软件包,没试过apt-get install gearman gearman-job-server gearman-server gearman-tools*/
因为本试验Client和Worker端都由PHP来实现,所以需要安装php的gearman扩展
安装Gearman PHP extension:
wget http://pecl.php.net/get/gearman-0.7.0.tgz
tar zxf gearman-0.7.0.tgz
cd gearman-0.7.0
phpize
./configure
sudo make
sudo make install
中间可能遇到的问题:
出现 error "unimplemented: Graphite loop optimizations .. 错误,
则执行
sudo apt-get install cloog-ppl
找不到phpize命令,phpize在php开发包中,所以要先安装php5-dev
sudo apt-get install php5-dev
编译时出错:configure: error: Please install libgearman,执行
apt-get install libgearman-dev
安装完后,就可以在源码目录中执行phpize生成相关安装配置信息,接着执行后面的./configure等
make install后,它告诉你一个目录,生成的gearman.so就在那里。
根据需要考到相应PHP的扩展目录里(因为我直接用系统默认安装的php,它自动生成就在扩展中)
接下来修改php.ini 在其中加入
extension = “gearman.so”
————————————————————————————————————————————
然后,开始编写client和worker端
client.php
<?php
$client= new GearmanClient();
$client->addServer(“127.0.0.1″, 4730);
print $client->do(“title”, “Linvo”);
print “\n”;
?>
worker.php
<?php
$worker= new GearmanWorker();
$worker->addServer(“127.0.0.1″, 4730);
$worker->addFunction(“title”, “title_function”);
while ($worker->work());
function title_function($job)
{
$str = $job->workload();
return strlen($str);
}
?>
准备工作已经完毕,试验开始
1、启动job
gearmand -d
2、启动worker
php -c /etc/php5/apache2/php.ini worker.php
3、启动client(新开终端中打开)
php -c /etc/php5/apache2/php.ini client.php
屏幕显示字符串的长度 “5”
这里,有几点需要说明一下:
1、这里直接用php cli方式运行,添加-c参数是为了加载php.ini配置文件,以加载gearman扩展
2、worker应该做成守护进程(CLI模式),可以开启多个,这样client发起的任务就会分发到各个worker分别来执行(自动负载均衡)
这个例子由于太过简单,即使开启多个worker也无法看出效果,不过可以通过终止其中一个,可以看出系统自动切换到其他worker继续正常执行
3、同理,client也是可以开启多个的(模型请参考之前的那边日志)
4、同时,job也可以开启多个,以避免单点故障
简易实作
接下来,我们可以试着用 PHP API 来连接 Job Server 。前面安装好 PECL 的 Gearman Extension 后,我们就可以在 PHP 程式裡建立操作 Gearman API 的物件了。
以下我用简单的方式来模拟 Client 和 Worker 的运作,所以这裡 Client 和 Worker 会在同一部主机上,但实际运作时是不需要的,请大家注意。
Client 端程式
<?php
$client= new GearmanClient();
$client->addServer("127.0.0.1", 4730);
$who = array('who_send'=>'web','get_email'=>'');
$img['image'] = '/var/www/pub/image/test.png';
print $client->do("sendEmail", serialize($who));
print "\n";
print $client->do("resizeImage", serialize($img));
print "\n";
?>
Worker 端程式
<?php
$worker = new GearmanWorker();
$worker->addServer(); // 预设为 localhost
$worker->addFunction('sendEmail', 'doSendEmail');
$worker->addFunction('resizeImage', 'doResizeImage');
while($worker->work()) {
sleep(1); // 无限回圈,并让 CPU 休息一下
}
function doSendEmail($job)
{
$data = unserialize($job->workload());
print_r($data);
sleep(3); // 模拟处理时间
echo "Email sending is done really.\n\n";
}
function doResizeImage($job)
{
$data = unserialize($job->workload());
print_r($data);
sleep(3); // 模拟处理时间
echo "Image resizing is really done.\n\n";
}
首先, PHP Gearman Extension 提供了一个名为 GearmanClient 的类别,它可以让程式安排工作给 Job Server 。
而 addServer 方法表示要通知的是哪些 Job Server ,也就是说如果有多台 Job Server 的话,就可以透过 addServer 新增。
然后我们将要呼叫哪个 Worker 以及该 Worker 所需要的资料,利用 GearmanClient 的 doBackground 方法传送过去。 doBackground 方法顾名思义就是在背景执行, Client 在丢出需求后就可以继续处理其他的程式,也就是我们常说的「射后不理」。
doBackground 方法的第一个参数是告诉 Job Server 要执行哪个功能,而这个功能则是由 Worker 提供的;要注意是,这个参数只是识别用的,并不是真正的函式名称。而第二个参数是要传给 Worker 的资料,它必须是个字串;因此如果要传送的是阵列的话,我们就要用 PHP 的 serialize 函式来对这些资料做序列化。
PHP 的 Gearman Extension 也提供了一个 GearmanWorker 类别,让我们可以实作 Worker 。而 GearmanWorker 类别也提供了addServer 方法,让所生成的 Worker 物件可以注册到 Job Server 中。
另外 GearmanWorker 类别也提供了 addFuncton 方法,告诉 Job Server 自己可以处理哪些工作。 addFunction 的第一个参数就是对应到 GearmanClient::doBackground 方法的第一个参数,也就是功能名称;这使得 Client 和 Worker 能透过这个名称来互相沟通。而第二个参数则是一个callback函式,它会指向真正应该要处理该工作的函式或类别方法等。
最后因为 Worker 因为要随时准备服务,是不能被中断的,因此我们透过一个无限迴圈来让它常驻在 Job Server 中。
测试
准备好 Client 和 Worker 的程式后,就可以测试看看了。首先我们必须得先执行 worker.php ,让它开始服务。
php worker.php
这时我们会看到 worker.php 停驻在等待服务。
接着我们开启另一个 console 视窗来执行 client.php :
切换到执行 worker.php 的 console 时,就会看到以下执行结果:
Array
(
[who_send] => web
[get_email] =>
)
Email sending is really done.
Array
(
[image] => /var/www/pub/image/test.png
)
Image resizing is really done.
这表示 Worker 正常地处理 Client 的需求了。
现在试着把 worker.php 停掉 (Ctrl+C) ,然后再执行 client.php ,大家应该会发现 client.php 还是正常地完成它的工作;这是因为 Job Server 帮我们把需求先放在 Queue 裡,等待 Worker 启动后再处理。
这时可以查看 MySQL 的 gearman 资料库,在 gearman_queue 资料表中应该就会看到以下结果:
这表示 Job Server 成功地将 Queue 保留在 MySQL 资料表中。
接着再执行 worker.php ,这时 Job Server 会得知 Worker 复活,赶紧将 Queue 裡面属于该 Worker 应该执行的工作再发送出去以完成作业;而 Worker 完成作业后, Job Server 就会把 Queue 清空了。
Message Queue 这个架构的应用可以说相当广泛,尤其在大流量的网站上,我们能透过它来来有效运用分散式的系统架构,以处理更多使用者的需求。
而目前 Gearman 可说是在 PHP 上一个很棒的 Message Queue 支援套件,而且 API 也相当完善;因此如果能善用 Gearman 的话,那么我们在 PHP 网站的架构上就可以有更大的延展性,也能有更多的可能性。
(转载自:http://hi.baidu.com/baisiye/item/b856baea3cc4892a5a7cfbe6)
补充说明:
1. 有个 gearadmin 的命令管理工具,可以查看gearman的运行状态等,如
bb2和bb1为注册的函数名,第一列为等待执行的任务数,第二列为正在执行的任务数,第三列为对应的worker 数。
2. gearmand -d 这个命令默认是使用内存存储队列的,假如需要使用持久化存储,可以结合mysql来使用。
新建数据库 gearman
新建表:
CREATETABLE`gearman_queue`(
`unique_key`VARCHAR(64)NOTNULL,
`function_name`VARCHAR(255)NOTNULL,
`priority`INT(11)NOTNULL,
`data`LONGBLOBNOTNULL,
`when_to_run`INT(11)NULLDEFAULTNULL,
PRIMARYKEY(`unique_key`)
)
使用mysql作为队列存储:
/usr/local/sbin/gearmand -L 127.0.0.1 --queue-type=mysql --mysql-host=127.0.0.1 --mysql-user=root --mysql-password=123456 --mysql-db=gearman --mysql-table=gearman_queue -d
从上面的命令参数可以看出需要配置的mysql数据表信息。-d 参数为使用守护进程运行gearmand。
经测试,假如在gearmand有任务队列执行的情况下重启,队列会继续保存着,只是worker丢失了,需要重新注册一次worker;而假如worker重启,gearman会自动继续执行队列任务。
3.
相关推荐
该资源包括安装Gearman时可能涉及到的软件包 具体包括gearmand、gearman、php、gperf、libevent
本篇文章将详细讲解如何在Linux环境中搭建Gearman,包括依赖库的安装和Gearman服务的配置。 首先,我们来看三个重要的依赖库: 1. **libevent-2.0.22-stable.tar.gz**: 这是libevent库的一个版本,它是一个事件...
Gearman中文手册,gearman手册chm,Gearman中文详解,分享gearman技术心得,主要是为了分享技术,所以不要大家的资源分。
为了在Java环境中使用Gearman,开发者首先需要下载并安装Gearman服务器,然后在项目中引入`gearman-java-0.04.jar`。根据`readme_gearman.txt`的指示,配置好服务器连接信息,并通过源代码或`java-gearman-service-...
下面将详细介绍 Gearman 的安装及相关资源。 在 Gearman 的安装过程中,通常会涉及以下几个步骤: 1. **下载源码**:从描述中看到提供了两个版本的 Gearman 源码包,分别是 `gearmand-1.1.12.tar.gz` 和 `gearman-...
对于PHP Gearman扩展,需要先安装gearman源码包和PHP扩展包。安装过程中可能会涉及依赖库的安装,比如boost-devel、libevent-devel、libuuid-devel等。对于不同版本的PHP,安装细节会有所不同,例如使用/data/...
确保你已经安装并启动了 Gearman 服务器。在服务器上,你可以使用 `gearmand` 命令启动服务。 ```bash sudo service gearmand start ``` ### Gearman 的优势 1. **异步处理**:通过 Gearman,可以将耗时的操作从...
安装gearman 如果没有mysql客户端,需要安装mysql客户端 yum install -y libevent-devel 上传gearman.zip,解压unzip gearman.zip rpm -ivh uuid-1.5.1-3.el5.x86_64.rpm rpm -ivh libgearman-1.1.8-2.el5.x86_64...
### Gearman文档与集群计算框架的关键知识点 #### 一、Gearman概述 **Gearman**是一种分布式任务调度框架,主要用于跨机器或者同一机器上的不同进程之间分发任务。它允许开发者将任务分解并分配给一组工作节点...
Gearman 是一个分布式任务队列系统,它允许应用程序在多台服务器之间分发工作负载,以提高处理效率和可扩展性。在这个“Gearman C# API和示例”项目中,我们将探讨如何使用C#语言与Gearman进行交互,以及如何在...
#### 安装与依赖 首先,你需要将 `libgearman-java` 添加到你的项目依赖中。如果是 Maven 项目,可以添加以下依赖到 `pom.xml` 文件: ```xml <groupId>com.yammer</groupId> <artifactId>gearman-client ...
首先,你需要通过Composer安装`mhlavc/gearman`库: ```bash composer require mhlavc/gearman ``` 然后在`config/app.php`的`providers`数组中添加服务提供者: ```php Mhlavc\Gearman\GearmanServiceProvider::...
GearMAN是一个高效的分布式任务框架,最初设计用于解决Web2.0环境中图片处理等耗时任务的快速分配和执行问题。它的名字来源于“Generic Worker Manager”,意在成为一个通用的任务分发工具。GearMAN通过将任务分配给...
Gearman中文手册,gearman手册chm,Gearman中文详解,分享gearman技术心得,主要是为了分享技术,所以不要大家的资源分。
确保你已经安装了所有依赖项,例如libgearman库和相关的头文件。 接下来,你需要在项目中包含必要的头文件,例如`#include <gearman/gearman.h>`,这将提供访问Gearman API的接口。然后,你可以使用`gearman_worker...
1)软件资源列表:《gearmand-1.1.12.tar.gz》,《gearman-1.1.2.tgz》。 2)安装操作系统环境:CentOS-6.5,(其它linux操作系统请自行尝试)。 3)本软件安装步骤详解:...
Gearman 是一个分布式任务队列系统,它允许应用程序在需要时分发工作并异步处理结果。这个名为 "gearman-mysql-udf-0.6.tar.gz" 的压缩包包含了一个 Gearman 与 MySQL 结合使用的用户定义函数(UDF)插件,版本为 ...
java实现gearman的job实现的jar包,包括gearman server,client和work客户端API
java-gearman-service-0.6.6.zip 包,gearman分为3部分,client - server - worker,创建 java 版本的client和worker部分。 其实在gearman中,client和worker的编写不复杂,但是不同厂商提供的API是不大相同的,本...
安装Gearman的任务服务器是相对直接的过程: 1. 通过源码编译:首先通过下载源码包进行解压,然后执行配置、编译、安装的常规步骤。 2. 使用PECL扩展:可以通过PECL安装Gearman的PHP扩展,命令行使用pecl安装gearman...