博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP实现异步任务分发处理利器-Gearman
阅读量:7050 次
发布时间:2019-06-28

本文共 1866 字,大约阅读时间需要 6 分钟。

hot3.png

通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用WebService的方式来处理此类集成问题,但不管采用何 种风格的WebService,如RPC风格,或者REST风格,其本身都有一定的复杂性。相比之下,Gearman也能实现类似的作用,而且更简单易 用。

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

Client:请求的发起者,可以是C,PHP,Perl, UDF等等。

Job:请求的调度者,用来负责协调把Client发出的请求转发给合适的Work。

Worker:请求的处理者,可以是C,PHP,Perl等等。

因为Client,Worker并不限制用一样的语言,所以有利于多语言多系统之间的集成。

甚至我们通过增加更多的Worker,可以很方便的实现应用程序的分布式负载均衡架构。

下面看看如何安装运行一个例子,条件所限,我们把Client,Job,Worker三个角色运行在一台服务器上:

安装Gearman and library:

wget http://launchpad.net/gearmand/trunk/0.8/+download/gearmand-0.8.tar.gz

tar zxf gearmand-0.8.tar.gz

cd gearmand-0.8

./configure

make

make install

安装Gearman PHP extension:

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

tar zxf gearman-0.4.0.tgz

cd gearman-0.4.0

phpize

./configure

make

make install

编辑php.ini配置文件加载相应模块并使之生效:

extension = “gearman.so”

启动Job:

gearmand -d

如果当前用户是的话,则需要这样操作:

gearmand -d -u root

缺省会使用4730端口,下面会用到。

注意:如果找不到gearmand命令的路径,别忘了用whereis gearmand确认。

编写Worker:

worker.php文件内容如下:

<?php

$worker= new GearmanWorker();

$worker->addServer(’127.0.0.1′, 4730);

$worker->addFunction(‘reverse’, ‘my_reverse_function’);

while ($worker->work());

function my_reverse_function($job)

{

return strrev($job->workload());

}

?>

设置后台运行work:

php worker.php &

编写Client:

client.php文件内容如下:

<?php

$client= new GearmanClient();

$client->addServer(’127.0.0.1′, 4730);

echo $client->do(‘reverse’, ‘Hello World!’), “\n”;

?>

运行client:

php client.php

输出:!dlroW olleH

出于方便的考虑,Worker,Client使用的都是PHP,但这并不影响演示,实际应用中,你完全可以通过Gearman集成不同语言实现的 Worker,Client。或许此时你还想了解前面提到的负载均衡功能:很简单,只要增加多个Worker即可,你可以按照worker.php的样子 多写几个类似的文件,并设置不同的返回值用以识别演示效果。然后依次启动这几个Worker文件,并多次使用client.php去请求,你就会发现 Job会把Client请求转发给不同的Worker。

命令行工具

如果你觉得安装PHP之类的东西太麻烦的话,你也可以仅仅通过命令行工具来体验Gearman的功能:

启动Worker:gearman -w -f wc — wc -l &

运行Client:gearman -f wc < /etc/passwd

作者:

原文链接:
版权所有,转载本网站文章时请保留此信息。

转载于:https://my.oschina.net/angelangel/blog/338459

你可能感兴趣的文章
java初始化构造函数调用顺序
查看>>
swift 之xib自定义view可视化到storyboard
查看>>
抓包工具fiddler
查看>>
系统引导一些区别
查看>>
leetcode 189. Rotate Array
查看>>
C# 保留2位小数
查看>>
画caffe训练loss曲线
查看>>
笔试题 (三)
查看>>
fastjson生成JSON字符串的时候出现$ref [转]
查看>>
[SpringBoot] - 发送带附件的邮件
查看>>
[Android Pro] 关于inputStream.available()方法获取文件的总大小
查看>>
uva 10859 Placing Lampposts / Tree DP
查看>>
[SCOI2008]着色方案
查看>>
2017年11月23日**科技面试java工程师面试总结
查看>>
Dynamic proxy (good-原创)
查看>>
线程中断方法interrupt() 与 cancel()
查看>>
iOS开发那些事儿(五)Objective-C浅拷贝与深拷贝
查看>>
结对编程2——单元测试
查看>>
bestcoder Round #7 前三题题解
查看>>
从零开始建设个人网站
查看>>