宝哥软件园

介绍Gearman的使用 这是一个PHP并发多进程处理的工具

编辑:宝哥软件园 来源:互联网 时间:2021-10-30

在工作中,我们有时会遇到一些问题,比如同时向多台服务器发布数据,或者同时处理多个任务。您可以使用PHP的curl_multi来并发处理请求,但是由于网络、数据和各种服务器等原因,这种并发处理的响应时间非常慢。因为并发请求的过程还包括日志记录、处理数据等逻辑。等待处理结果并返回,无法友好地满足后台操作体验。

现在,有另一个方案,Gearman,来满足并发需求。通过客户端将请求发送给Gearman的Jobs,并在每个Work中进行curl_multi、数据处理和日志记录等操作。同时,使用监控器监控Gearman和Works的进程,可以实现并行多进程和负载均衡方案。

gear man :能做什么?

异步处理:图像处理、订单处理、批量邮件/通知等需要高CPU或内存的处理:大容量数据处理、MapReduce操作、日志聚合、视频编码分布式和并行处理定时处理:增量更新、FIFO以有限的数据复制速率处理分布式系统监控任务。

Gearman的工作原理:使用Gearman的应用程序通常由三部分组成:客户端、工作器和任务服务器。客户端的功能是向作业服务器任务服务器呈现作业任务。作业服务器将找到合适的工作人员来完成此任务。工作人员执行客户端发送的作业,并通过作业服务器将结果返回给客户端。Gearman提供了客户端和工作器的API,可以用来与Gearman作业服务器进行通信。客户机和工作机之间的通信通过TCP连接进行。

Gearman可以在不同的机器之间分担工作量。

安装:

复制代码如下:rpm-ivhhttp://dl.iuscommunity.org/pub/ius/stable/red hat/6/x86 _ 64/epel-release-6-5 . no arch . rpm yum install-y gear mand。

开始:gearmand -d d。

我用pcel安装PHP Gearman扩展,你也可以下载源码包编译安装,但是记得先安装libgearman和re2c,否则扩展的编译安装会出错。

Pecl安装gearman #不成功,并提示版本问题。您可以尝试pecl安装gearman-1.0.3。好像默认是1.1.2。编译和安装也很简单。复制代码如下: wget-C http://pecl.php.net/get/gearman-1.1.1.tgztar Zxvf齿轮人-1 . 1 . 1 . tgzphpize/Configure Make Make Install Echo ' Extension=Gear Man . so '/etc/PHP . ini

PHP的接口函数Gearman提供了很多完善的扩展功能,包括GEARMANCLIENT、GEARMANJOB、GEARMANTASK和GEARMANWORKER。具体可以查看PHP官方手册。这是政府提供的示例之一,相当于并发分发任务处理的示例。

?PHP $ client=new gear manclient();$ client-addServer();//在这里初始化我们3个‘查询结果’的结果$ userInfo=$ friends=$ posts=null//这设置了当任务返回给我们时gearman将回调到什么。//$ context帮助我们知道正在返回哪个函数,以便我们能够//正确地处理它。$client-setCompleteCallback(函数(GearmanTask $task,$context) use ($userInfo,$friends,$ post){ switch($ context){ case ' lookup _ user ' : $ userInfo=$ task-data();打破;case ' bacon ate ' : $ friends=$ task-data();打破;case ' get _ latest _ post _ by ' : $ post=$ task-data();打破;}});//这里我们将多个任务排队,按照gearmand能给我们的$client-addTask('lookup_user ','[emailprotected]',' lookup_user ')的并行度执行*;$client-addTask('baconate ','[emailprotected]',' bacon ate ');$ client-AddTask(' get _ latest _ post _ by ','[emailprotected]',' get _ latest _ post _ by ');“回声”提取. n ';$ start=micro time(true);$ client-runTasks();$ total time=number _ format(micro time(true)-$ start,2);echo“在in: $ totaltime seconds:中获得用户信息 n”;var_dump($userInfo,$friends,$ postsgearman_work.php

?PHP $ worker=new GearManWorker();$ worker-addServer();$ worker-AddFuncTion(' lookup _ user ',function(GearmanJob $job) {//通常情况下,您会在这里使用一些非常安全的类型检查和绑定到数据库的查询。//.我们要假装睡觉。返回"用户请求的"(。$ job-工作量()。)身高七英尺,令人敬畏;});$worker-addFunction('baconate ',function(GearmAnJob $ job){ sleep(3);返回"用户"(。$ job-工作量()。)离凯文贝肯一度;});$ worker-AddFuncTion(' get _ latest _ post _ by ',function(gear man job $ job){ sleep(3);返回"用户"(。$ job-工作量()。)没有帖子,抱歉!});while($ worker-work());我在3个终端中都执行了gearman_work.php

[电子邮件保护]: ~ $ PS aux | grep gear man * | grep-v grepgearman 1504 0.0 0.1 60536 1264?SSL 11:06 0:00/usr/sbin/齿轮指令-PID-file=/var/run/齿轮人/齿轮指令。PID-用户=齿轮人-守护进程-日志-文件=/var/log/齿轮人-作业-服务器/齿轮人。log-listen=1270 .0 .1瑞安2992 0。0 .8 43340 9036 pts/0S 14:05 0:00来查看下执行gearman_work.php的结果壳

复制代码代码如下:提取.在: 3.03秒内获得用户信息3360字符串(59)”请求的用户([emailprotected])有七英尺高,很棒的"字符串(56)" "用户([emailprotected])与凯文贝肯的"字符串(43)"有一度之遥用户([emailprotected])没有帖子,抱歉!"

看到上面的3.03秒,说明客户请求过去的任务被并行分发执行了。在实际的生产环境中,为了监测齿轮命令和工作的进程没有被意外退出,我们可以借助监督者这个工具。

更多资讯
游戏推荐
更多+