并发利器 Gearman (一) 尝试

PHP 没有提供直接的并发功能。要实现并发,必须:php

function asyn_send(){bootstrap

$fp = fsockopen('localhost', 80, &$errno, &$errstr, 5);并发

if(!$fp){函数

echo "$errstr ($errno)
/n";ui

}spa

fputs($fp, "GET /sync.php?param=1&param2=2&a=c/r/n");.net

fclose($fp);命令行

}代理

要否则, PHP 会逐条代码执行,上一条执行完成后才会执行下一条。而上面这种方式处理扩展性不够强。orm

PHP 的 Gearman 库能把工做分发给一组机器。Gearman 会对做业进行排队并少许分派做业,而将那些复杂的任务分发给为此任务预留的机器。

这个库对 Perl、Ruby、C、Python 及 PHP 开发人员都可用,而且还能够运行于任何相似 UNIX® 的平台上,包括 Mac OS X、 Linux® 和 Sun Solaris。

向一个 PHP 应用程序添加 Gearman 很是简单。咱们是将 PHP 应用程序托管在一个典型的 LAMP 配置上,那么 Gearman 将须要一个额外的守护程序以及一个 PHP 扩展。

安装 Gearman

======================

向一个机器添加 Gearman 须要两步:

1.构建并启动这个守护程序

2.构建与 PHP 版本相匹配的 PHP 扩展。

守护程序

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

这个守护程序包包括构建此扩展所需的全部库。

首先,下载 Gearman 守护程序 gearmand 的最新源代码,解压缩这个 tarball,构建并安装此代码(安装须要有超级用户的权限,即根用户权限)。

下载页面是:https://launchpad.net/gearmand/

wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.5.tar.gz

tar -zxf gearmand-1.1.5.tar.gz

cd gearmand-1.1.5

./configure

这时报错:

checking whether build environment is sane... configure: error: newly created file is older than distributed files!

原来是系统时间不对.从新设置一下时间

设置好后又报错:

cannot find Boost headers version

这是由于boost的版本低于 1.37.0,须要安装超过1.37.0的boost库

能够去下载新一点的boost库,下载地址为

http://sourceforge.net/projects/boost/files/boost/1.53.0/

wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz/download

下载完毕后,解压缩包

tar -zxf boost_1_44_0.tar.gz

而后进入目录boost_1_44_0执行

./bootstrap.sh --prefix=/usr/local/boost

生成bjam之后,再执行

./bjam install

执行软连接

ln -s /usr/local/boost/include/boost/ /usr/local/include/boost

ln -s /usr/local/boost/lib/libboost_program_options.so  /usr/lib/libboost_program_options.so

ln -s /usr/local/boost/lib/libboost_program_options.so.1.53.0 /usr/lib/libboost_program_options.so.1.53.0 

回到gearmand-1.1.5目录

make

make install

PHP 扩展

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

安装 gearmand 后,构建 PHP 扩展。从 PECL 获取这个 tarball,也能够从 Github 复制该存储库。

wget http://pecl.php.net/get/gearman-1.1.1.tgz

tar -zxf gearman-1.1.1.tgz

cd gearman-1.1.1

有了这些代码后,就能够开始构建扩展了:

phpize

./configure --with-php-config=/usr/local/php/bin/php-config 

make

make install

这个 Gearman 守护程序一般被安装在 /usr/local/sbin。

能够从命令行直接启动此守护程序,也能够将这个守护程序添加到启动配置中,以便在机器每次重启时就能够启动这个守护程序。

接下来,须要安装 Gearman 扩展。

打开 php.ini 文件(个人在:/usr/local/php/etc/php.ini 能够经过:find / -type f -name php.ini 查找),而后添加代码行 extension = gearman.so:

vi /usr/local/php/etc/php.ini

...

extension = gearman.so

保存此文件。要想验证扩展是否启用,请运行 php --info,而后查找 Gearman:

php --info | grep "gearman support"

获得结果:

gearman support => enabled

此外,还能够用一个 PHP 代码片断来验证构建和安装是否得当。将这个小应用程序保存到 verify_gearman.php:

<?php

  print gearman_version() . "\n";

?>

接下来,从命令行运行此程序:

$ php verify_gearman.php

1.1.5

若是这个版本号与以前构建和安装的 Gearman 库的版本号相匹配,那么系统就已准备好了。

运行 Gearman

======================

一个 Gearman 配置有三个角色:

一个或多个 producer 生成工做请求。每一个工做请求命名它所想要的函数,例如 email_all 或 analyze。

一个或多个 consumer 完成请求。每一个 consumer 命名它所提供的一个或多个函数并向 agent 注册这些功能。

一个 consumer 也能够被称为是一个 worker。

代理对与之创建链接的那些 consumer 提供的全部服务进行集中编制。它将 producer 与恰当的 consumer 联系起来。

借助以下的命令行,能够当即体验 Gearman:

启动这个 agent,即 Gearman 守护程序:

/usr/local/sbin/gearmand --daemon

报错:Could not open log file "/usr/local/var/log/gearmand.log", from "/usr/sbin", switching to stderr. (No such file or directory)

解决:

mkdir -p /usr/local/var/log/

cd /usr/local/var/log/

touch gearmand.log

再次尝试启动:

/usr/local/sbin/gearmand --daemon

成功运行.查看进程:ps -ef | grep gearmand

root     19390     1  0 17:50 ?        00:00:00 gearmand --daemon

root     19403     1  0 17:54 ?        00:00:00 /usr/local/sbin/gearmand --daemon

root     19406  1556  0 17:54 pts/3    00:00:00 grep gearmand

从 PHP 使用 Gearman

======================

从 PHP 使用 Gearman 相似于以前的示例,唯一的区别在于这里是在 PHP 内建立 producer 和 consumer。

每一个 consumer 的工做均封装在一个或多个 PHP 函数内。

先用 PHP 编写的一个 Gearman worker。将这些代码保存在一个名为 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()));

  }

?>

再用 PHP 编写的一个 producer,或 client。将此代码保存在一个名为 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

相关文章
相关标签/搜索