转载自 bigbigant
最终编辑 bigbigant
skyxo 童鞋翻译自gearman.org

Gearman介绍参考: http://hi.baidu.com/bigbigant/blog/item/7f395f60d0d9a2d08db10dee.html
Job Server

Gearman目前有三种job server的接口,但是这里将枪口对准开发中最活跃的Gearman C Job Server。下载中能够找到其他的选择。

孔乙己:“安装Gearman C Job Server有四种方法,你都知道么?”
安装
Ubuntu安装包(从Launchpad获取)

最新的Ubuntu安装包通过Launchpad Persona Package Archive (PPA)与广大人民群众见面,并且PPA会指导您如何安装。这些包们会在tarball发行后不久更新。
Debain/sid安装包

在Debian/sid, 运行'apt-get install gearman-job-server'即可。这类包可能稍微有点奥特,因为它们是版本库的跟班。
源码(tarball)编译安装

这是得到新鲜出炉的稳定特性最好的法子了。从下载或Launchpad搞到tarball后,运行:

tar xzf gearmand-X.Y.tar.gz
cd gearmand-X.Y
./configure
make
make install

源码(版本库)编译安装

使用版本控制系统Bazaar检出最新的稳定源码,下载并安装之:

bzr branch lp:gearmand
cd gearmand
./config/autorun.sh
./configure
make
make install

人间大炮,发射

一旦job server安装好了,可以这样让它跑起来:

$ gearmand -d

-d 选项可以让server脱离shell,在后台中运行。如果希望在调试模式中运行,可以使用一个或多个 -v 标识:

$ gearmand -vv
 INFO Starting up
 INFO Listening on :::4730 (6)
 INFO Creating wakeup pipe
 INFO Creating IO thread wakeup pipe
 INFO Adding event for listening socket (6)
 INFO Adding event for wakeup pipe
 INFO Entering main event loop

Client 和 Worker 的 API

job server已经在服务器上运行,下一步是选择一个client和worker的API。在下载中有多种可供选择,但是这里主要关注命令行的使用与php扩展。
Gearman 命令行工具

这个工具作为Gearman C Server和Library的一部分被安装。client和worker接口都有,并且各自有n多选项。运行 gearman -H 查看所有可用的选项。
Worker

-W 选项将使gearman tool在worker模式下运行。在所有选项定义之后,一行命令可以被指定,让每个job运行。例如:

$ gearman -w -f wc -- wc -l

这时,一个worker被开启,连接到localhost(默认)上的job server,并且注册名为 wc 的function(-f 选项的参数)。当每位job莅临时,gearman tool会分出一个进程来干活(在这里即运行 wc -l)。gearman tool把job要处理的workload(这里代表需要wc -l的内容,译者注)写入这个进程的标准输入,然后读取标准输出获取结果。gearman tool会以海枯石烂的精神等在那里接job,直到被CTRL-C或者杀了它。
Client

缺少标识worker的 -w 选项时,gearman tool以client的方式运行。默认情况下,它提交一个前台的job等待回应。当然,也可以通过指定 -b 选项在后台运行。这个job将要处理的workload可以在所有选项之后给出,或者像其他的shell用法一样,通过管道提供。例如:

$ gearman -f wc < /etc/passwd
26

这句话向localhost上的gearman job server提交了一个前台的job,运行叫做 wc 的function,而这个job的workload为文件 /etc/passwd 的全部内容。然后,上面启动的worker将会处理这个请求,将结果 26 返送。这就相当于运行:

$ wc -l < /etc/passwd

在gearman的机制上,job server、 client和worker均可以在不同的服务器上运行。这个命令行的东东是一种能够快速成型的分布式管理工具,如果需要将消耗资源较大的shell脚本(例如日志分析)放到其他服务器们运行,它是粉有用滴。
Gearman 的 PHP 扩展

包含了C Library的php扩展会随着gearman C Job Server安装。它在php中提供了和C接口长得很像的client和worker接口。这个php扩展同时提供了面向过程和面向对象的接口。这就让我 们可以使用任何一种编程方式。在这里主要介绍面向对象接口。
安装

同其他大多数扩展一样,gearman的php扩展也通过PECL管理。请确定php开发包已经安装(在Ubuntu或Debian上为php5-dev),对于开发和运行worker,php命令行接口也是必需的(在Ubuntu或Debian上为php5-cli)。可以从PECL上下载tarball,然后编译安装之:

tar xzf gearman-X.Y.tgz
cd gearman-X.Y
phpize
./configure
make
make install

下面这行需要添加到所有的 php.ini 中,通常位于 /etc/php*。

extension="gearman.so"

现在,这个模块可以用在所有的php中了。建立一个gearman_version.php来测试下php命令行的使用,内容如下:

<?php
print gearman_version() . "\n";
?>

运行之:

$ php gearman_version.php
0.8

如果发现有任何错误被报出来,这个扩展就口年的被安装失败了……
Worker

下面这个worker会从输入中拿到一个字符串,将其反转后输出:

<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work());

function my_reverse_function($job)
{
  return strrev($job->workload());
}
?>

这段代码创建了一个worker对象,增加了默认服务器(localhost),为回调函数 my_reverse_function 注册了一个叫做 reverse 的function,然后进入循环等待job。每当接到一个job,回调函数会被运行,将workload中的字符串反转输出。如果这段代码是被放到叫做 worker.php 的文件,可以这样启动它:

$ php worker.php

然后它也去海枯石烂了,直到CTRL-C或者被杀掉。
Client

client接口与worker很类似。下面这段代码会发送一个字符串到job server,将返回值打印出来:

<?php
$client= new GearmanClient();
$client->addServer();
print $client->do("reverse", "Hello World!");
?>

它创建了一个client对象,添加到默认服务器(localhost),然后把 reverse 作为function,Hello World! 作为workload送到job server,打印出结果。如果它在 client.php 中,这样来运行它:

$ php client.php
!dlroW olleH

调整图片大小的应用

这个段落结合上边提到的组件,演示一个简单的Gearman应用。Gearman一个早期的目标是把开销大的图片处理放到其他机器上,下边例子正好说的是这个东西。这个例子使用了PHP的ImageMagick模块。(php5-imagick package on Ubuntu or Debian).
调大小Worker

下面的代码实现了一个woker.他以整个图片的二进制数据作为workload,修改图片尺寸,然后返回处理后的图片二进制数据。这可能不是最有效的图 片处理的实现,因为图片数据一般会存在共享文件系统中。传入URL或文件路径传递,处理后把结果再写入共享存储可能是更明智的选择。不过,为了让这个演示 保持简洁,我们暂且直接传递文件blob。

<?php
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("resize", "my_resize_function");
while ($worker->work());
 
function my_resize_function($job)
{
  $thumb = new Imagick();
  $thumb->readImageBlob($job->workload());
 
  if ($thumb->getImageHeight() > 600)
    $thumb->scaleImage(0, 600);
  else if ($thumb->getImageWidth() > 800)
    $thumb->scaleImage(800, 0);
 
  return $thumb->getImageBlob();
}
?>

这个程序和上边的反转字符串的程序很像。只有resize的回调函数不同。图片处理的细节可以参考 PHP ImageMagick文档。这里的关键是 输入的是图片blob作为workload,输出的也是通过getImageBlob() 方法获取的blob.如上边提到的, 输入输入改为 共享存储的url或pathname应该是更好地解决方案。

调大小Client

最简单的测试worker的途径是使用命令行。假设上边写的resize worker正在运行,下面的命令把一个完整尺寸的图片作为workload发送,然后把输出写入到thumbnail image文件里。这里用到了shell的文件输入输出重定向。

$ gearman -f resize < full.jpg > thumb.jpg
$ ls -l full.jpg thumb.jpg
-rw-r--r-- 1 eday eday 3220493 2009-06-24 12:14 full.jpg
-rw-r--r-- 1 eday eday  328421 2009-06-24 12:21 thumb.jpg