php使用gearman进行任务分发操作实例详解


Posted in PHP onFebruary 26, 2020

本文实例讲述了php使用gearman进行任务分发操作。分享给大家供大家参考,具体如下:

一、安装gearman

下载gearman源码包

https://launchpad.net/gearmand/+download

如: gearmand-1.1.12.tar.gz

下载php的gearman扩展包

http://pecl.php.net/package/gearman

如: gearman-1.1.2.tgz

安装gearman

> yum install boost-devel gperf libevent-devel libuuid-devel
> tar xf gearmand-1.1.12.tar.gz
> cd gearmand-1.1.12
> ./configure
> make && make install

安装gearman的php扩展(建议php版本不要过高,因为php7的gearman扩展目前还没有出来)

> yum install autoconf
> tar xf gearman-1.1.2.tgz
> cd gearman-1.1.2
> /data/php56/bin/phpize
> ./configure --with-php-config=/data/php56/bin/php-config
> make && make install

修改php.ini

> vi /data/php56/lib/php.ini

添加如下两项

extension_dir=/data/php56/lib/php/extensions/no-debug-zts-20131226/
extension=gearman.so

查看扩展

> /data/php56/bin/php -m

二、简单的使用gearman

gearman中请求的处理过程一般涉及三种角色:client->job->worker
其中client是请求的发起者
job是请求的调度者,用于把客户的请求分发到不同的worker上进行工作
worker是请求的处理者

比如这里我们要处理client向job发送一个请求,来计算两个数之和,job负责调度worker来具体实现计算两数之和。

首先我们编写client.php

<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);
//doNormal是同步的,等待worker处理完成返回结果
//建议不要使用do()了
$ret = $client->doNormal('sum', serialize(array(10, 10)));

if($ret) {
  echo '计算结果:', $ret, "\n";
}

再编写worker.php

<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('sum', function($job) {
  //workload()获取客户端发送来的序列化数据
  $data = unserialize($job->workload());

  return $data[0] + $data[1];
});

//死循环
while(true) {
  //等待job提交的任务
  $ret = $worker->work();
  if ($worker->returnCode() != GEARMAN_SUCCESS) {
    break;
  }
}

我们先启动gearmand服务

> mkdir -p /usr/local/var/log
> gearmand -d

运行worker文件

> /data/php56/bin/php /data/worker.php

再运行client文件

> /data/php56/bin/php /data/client.php

结果如下:

php使用gearman进行任务分发操作实例详解

三、gearman异步的处理任务

这里我们client向job发送一个发送邮件的请求,不等待请求完成,继续向下执行。

client.php代码如下:

<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);
//doBackground异步,返回提交任务的句柄
$ret = $client->doBackground('sendEmail', json_encode(array(
  'email' => 'test@qq.com',
  'title' => '测试异步',
  'body' => '异步执行好牛B的样子',
)));

//继续执行下面的代码
echo "我的内心毫无波动,甚至还想笑\n";

do {
  sleep(1);

  //获取任务句柄的状态
  //jobStatus返回的是一个数组
  //第一个,表示工作是否已经知道
  //第二个,工作是否在运行
  //第三和第四,分别对应完成百分比的分子与分母
  $status = $client->jobStatus($ret);
  
  echo "完成情况:{$status[2]}/{$status[3]}\n";

  if(!$status[1]) {
    break;
  }
} while(true);

worker.php代码如下:

<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('sendEmail', function($job) {
  //workload()获取客户端发送来的序列化数据
  $data = json_decode($job->workload(), true);
  //模拟发送邮件所用时间
  sleep(6);
  echo "发送{$data['email']}邮件成功\n";
});

//死循环
//等待job提交的任务
while($worker->work());

结果如下:

php使用gearman进行任务分发操作实例详解

四、gearman并行的执行多个任务

我们如何并行的计算两个数的累加和? 通过addTask添加多个任务到队列,然后进行并行计算。

client.php代码如下:

<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);
//设置任务完成时的回调函数
$client->setCompleteCallback(function($task) {
  //获取由worker返回的数据
  echo $task->data(), "\n";
});

//计算1到500的累加和
//添加五个任务到队列
$client->addTask('sum', json_encode(array(1, 100)));
$client->addTask('sum', json_encode(array(100, 200)));
$client->addTask('sum', json_encode(array(200, 300)));
$client->addTask('sum', json_encode(array(300, 400)));
$client->addTask('sum', json_encode(array(400, 500)));

//运行队列中的任务,do系列不需要runTask()
$client->runTasks();

worker.php代码如下:

<?php
//创建一个worker
$worker = new GearmanWorker();
//添加一个job服务
$worker->addServer('127.0.0.1', 4730);
//注册一个回调函数,用于业务处理
$worker->addFunction('sum', function($job) {
  //workload()获取客户端发送来的序列化数据
  $data = json_decode($job->workload(), true);
  sleep(1);
  $sum = 0;
  for($ix = $data[0]; $ix < $data[1]; ++$ix) {
    $sum += $ix;
  }
  return $sum;
});

//死循环
//等待job提交的任务
while($worker->work());

我们开启5个worker工作进程,当运行客户端请求时,5个计算任务几乎是同时返回结果。

结果如下:

php使用gearman进行任务分发操作实例详解

php使用gearman进行任务分发操作实例详解

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
mysql5写入和读出乱码解决
Nov 25 PHP
php创建多级目录代码
Jun 05 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
Aug 22 PHP
PHP合并静态文件详解
Nov 14 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
php cookie用户登录的详解及实例代码
Jan 03 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP生成加减算法方式的验证码实例
Mar 12 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 17 PHP
php实现根据身份证获取精准年龄
Feb 26 #PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 #PHP
PHP实现创建一个RPC服务操作示例
Feb 23 #PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 #PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 #PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 #PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 #PHP
You might like
虫族 Zerg 魔法科技
2020/03/14 星际争霸
Smarty Foreach 使用说明
2010/03/23 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
jquery 循环显示div的示例代码
2013/10/18 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
Python 的类、继承和多态详解
2017/07/16 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
Numpy之random函数使用学习
2019/01/29 Python
python 获取等间隔的数组实例
2019/07/04 Python
python+pygame实现坦克大战
2019/09/10 Python
如何在python中写hive脚本
2019/11/08 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
国培远程培训感言
2014/03/08 职场文书
教师师德演讲稿
2014/05/06 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
教师继续教育反思周记
2015/06/25 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
90条交通安全宣传标语
2019/10/12 职场文书