并发利器 Gearman (一) 尝试

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

function asyn_send(){

$fp = fsockopen(‘localhost‘, 80, &$errno, &$errstr, 5);

if(!$fp){

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

}

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

fclose($fp);

}

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

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

时间: 2024-10-13 13:41:21

并发利器 Gearman (一) 尝试的相关文章

PHP实现异步任务分发处理利器-Gearman

通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用WebService的方式来处理此类集成问题,但不管采用何 种风格的WebService,如RPC风格,或者REST风格,其本身都有一定的复杂性.相比之下,Gearman也能实现类似的作用,而且更简单易 用. 一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker. Client:请求的发起者,可以是C,PHP,Perl,MySQL UDF等等. Job:请求的调度者,用来负责协调把Clien

异步并发利器:实际项目中使用CompletionService提升系统性能的一次实践

场景 随着互联网应用的深入,很多传统行业也都需要接入到互联网.我们公司也是这样,保险核心需要和很多保险中介对接,比如阿里.京东等等.这些公司对于接口服务的性能有些比较高的要求,传统的核心无法满足要求,所以信息技术部领导高瞻远瞩,决定开发互联网接入服务,满足来自性能的需求. 概念 CompletionService将Executor和BlockingQueue的功能融合在一起,将Callable任务提交给CompletionService来执行,然后使用类似于队列操作的take和poll等方法来获

MySQL在并发场景下的问题及解决思路

1.背景 对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为了满足这一目标大多数数据库通过锁和事务机制来实现,MySQL数据库也不例外.尽管如此我们仍然会在业务开发过程中遇到各种各样的疑难问题,本文将以案例的方式演示常见的并发问题并分析解决思路. 2.表锁导致的慢查询的问题 首先我们看一个简单案例,根据ID查询一条用户信息: mysql> select * from user where

ElasticSearch 并发冲突+悲观锁与乐观锁+基于_version和external version进行乐观锁并发控制

1.图解剖析Elasticsearch并发冲突问题 2.图解剖析悲观锁与乐观锁两种并发控制方案 3.图解Elasticsearch内部如何基于_version进行乐观锁并发控制 (1)_version元数据 PUT /test_index/test_type/6{ "test_field": "test test"} { "_index": "test_index", "_type": "test

《Netty Zookeeper Redis 高并发实战》 图书简介

<Netty Zookeeper Redis 高并发实战> 图书简介 ## 重要的重复3遍: 本书 面试必备 + 面试必备 + 面试必备 购买链接 京东商城<Netty Zookeeper Redis 高并发实战 > <Netty Zookeeper Redis 高并发实战> 图书简介 机械工业出版社出版,尼恩编著的<Netty Zookeeper Redis 高并发实战>一书, 从操作系统底层的IO原理入手,同时提供高性能开发的实战案例,是一本高并发Jav

CRUD全栈式编程架构之MVC的扩展设计

MVC执行流程 路由的扩展 我理解的路由作用有以下几个 Seo优化,用“/”分开的url爬虫更爱吃 物理和逻辑文件分离,url不再按照文件路径映射 Controller,Action的选择 MVC路由的扩展 实话实说MVC的路由我很少去做扩展,在MVC4时代,还会去重写掉url的大小写,而在MVC5之后,MVC自带了配置去小写化url.不过有一个配置还是必须要提一下那就是Area,在你的系统达到一定规模之后,Controllers通过Area来管理将会变得更容易.这里给出我的Area扩展,很简单

LINQ To SQL 语法及实例大全

LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c

LINQ综合学习大全

LINQ体验 LINQ体验(1)——Visual Studio 2008新特性 一.写本系列的目的 我平时利用课余零碎时间来学习ASP.NET3.5.LINQ.Silverlight.ASP.NET 3.5 Extensions等新东西,通过笔记形式来记录自己所学的历程,也给大家一起学习Visual Studio 2008 和 .NET 3.5提供一个平台,为保证此系列的完整性,我打算先依次介绍一下C# 3.0新语言特性和改进,然后从一条一条LINQ语句分析来贯穿LINQ的知识点.最后通过一个实

SqlServer锁机制与实践

在如今这个云计算,大数据,移动互联网大行其道的时代,各种NoSQL数据库MongoDb.redis.HBase等使用的越来越广泛,大有替代关系型数据库的趋势.但是关系型数据库真的已经落伍了吗?答案是否定的.非关系型数据库不支持ACID属性,不支持事务,无法适应复杂查询的缺点.关系型数据库凭借其强一致性的特点,注定了在类似银行转账,订单支付等场景中,还是唯一的选择.众所周知,SQLSERVER通过锁来提供ACID属性,处理并发访问,本文尝试通过对锁机制的一些学习,让我们明白数据库查询超时,死锁等问