php 7 gearman,centos(php7)下gearman实现异步处理队列任务
安装gearman需要的环境
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar zxvf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=/usr
make
make install
yum install libevent-devel -y
yum install boost boost-devel -y
yum install gperf* -y
yum install libuuid-devel -y
安装gearman
wget https://github.com/gearman/gearmand/releases/download/1.1.17/gearmand-1.1.17.tar.gz
tar zxvf gearmand-1.1.17.tar.gz
cd gearmand-1.1.17
./configure --prefix=/usr/local/gearman
make
make install
/sbin/ldconfig
gearman自动
mikdir /usr/local/gearman/var/log
gearmand -d -l /usr/local/gearman/var/log/gearman.log
gearmand -V
# 输出:gearmand 1.1.17 - https://github.com/gearman/gearmand/issues
安装php扩展gearman
wget http://pecl.php.net/get/gearman-1.1.2.tgz
#如果是php7:wget https://github.com/wcgallego/pecl-gearman/archive/master.zip
tar zxvf gearman-1.1.2.tgz
cd gearman-1.1.2
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
修改php.ini
extension = gearman.so
#重启php-fpm 或者 重启apache
程序实现
简单的的字符反转案例(来自官方翻译,稍作修改)
client.php 任务发送方
$client = new GearmanClient();
// 添加服务器
// php官方文档:http://php.net/manual/en/gearmanclient.addserver.php
// $client->addServer("10.0.0.2", 7003);
$client->addServer();
echo "发送任务:
";
// 发送 {"msg":"test"}, workload消息给 task_func_name 任务
$data = '{"msg":"' . $argv[1] . '"}';
$result = $client->doNormal("task_func_name", $data); //普通任务,阻塞
#$result = $client->doBackground("task_func_name", $data); //后台任务,直接返回任务句柄
var_dump($result);
?>
work.php 任务接收消费方
$worker = new GearmanWorker();
$worker->addServer() or die("无法链接服务器");
// 通知服务器,$worker绑定task_func_name处理函数work_func。
$worker->addFunction("task_func_name", "work_func");
while (1) {
print "接收任务...
";
$ret = $worker->work(); // reverse_fn 任务执行完成
if ($ret != true) { //代码和下面一样
break;
}
//获取最后一次执行任务的返回码 执行成功正常返回0
if ($worker->returnCode() != GEARMAN_SUCCESS) {
break;
}
}
// A much simple reverse function
function work_func(GearmanJob $job) {
$workload = $job->workload(); //取得发送方发送的消息
echo "Received job: " . $job->handle() . "
"; //获取任务的句柄,有服务器自动分配,对用户不透明
echo "Workload: $workload
";
$result = json_decode($workload, true);
$result['msg'] = strrev($result['msg']);
$json = json_encode($result);
echo "Result: $json
";
return $json;
}
?>
调用方式:
#启动接收消费方
php work.php
#output: 接收任务...
//启动发送消息方
php client.php testmsg1
# output:
# 发送任务:
# string(18) "{"msg":"1gsmtset"}"
php client.php testmsg2
# output:
# 发送任务:
# string(18) "{"msg":"2gsmtset"}"
修改client里改成后台
php client.php testmsg1
# output:
# string(26) "H:localhost.localdomain:59" //这里不再返回的结果了
总结
不管是阻塞还是异步直接返回,消费者这边都是根据入队列的顺序依次执行,即:一个执行完再接一个,如果一个任务消费很长时间,后续任务都会在等待前个处理完才可以继续执行
多任务案列(来自官方,小刀改)
client.php
$client = new GearmanClient();
$client->addServer();
// 初始化三个变量
$userInfo = $friends = $posts = null;
//消费端执行完成任务这里会被异步调用
$client->setCompleteCallback(function(GearmanTask $task, $context) use (&$userInfo, &$friends, &$posts) {
switch($context) {
case 'content_task1':
$userInfo = $task->data();
$aa = $task->data();
break;
case 'content_task2':
$friends = $task->data();
$aa = $task->data();
break;
case 'content_task3':
$posts = $task->data();
$aa = $task->data();
break;
}
});
// 添加任务
$client->addTask('task1', 'qkl', 'content_task1');
$client->addTask('task2', 'qkl', 'content_task2');
$client->addTask('task3', 'qkl', 'content_task3');
echo "读取中...
";
$start = microtime(true);
$client->runTasks();
$totaltime = number_format(microtime(true) - $start, 2);
echo "得到结果消耗的时间: $totaltime 秒:
";
var_dump($userInfo, $friends, $posts);
?>
work.php
$worker = new GearmanWorker();
$worker->addServer();
//这里注意,多任务的执行顺序是根据消费者这边注册消息类型的顺序依次来执行,且要等上一次执行完成才可以继续
//现在注册顺序是task1 task2 task3 执行顺序就是task1 task2 task3
//现在注册顺序是task3 task2 task1 执行顺序就是task3 task2 task1
$worker->addFunction('task1', function(GearmanJob $job){
sleep(2);
return 'task1: '. $job->workload();
});
$worker->addFunction('task2', function(GearmanJob $job){
return 'task2: '. $job->workload();
});
$worker->addFunction('task3', function(GearmanJob $job){
return 'task3: '. $job->workload();
});
while (true) {
$ret = $worker->work();
var_dump($ret);
};
?>
总结
这里多任务场景目前没有特别好的场景构想,理论那些一步步同步执行顺序的流程的业务,只是gearman可以client添加任务后直接执行后续任务,业务交给消费端慢慢执行
php 7 gearman,centos(php7)下gearman实现异步处理队列任务相关推荐
- centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展
| CentOS环境下给PHP7.0安装yaf扩展 在CentOS环境下给PHP7.0安装yaf扩展,首先要知道PHP的安装目录在哪里,以我当前的路径为例,在/usr/local/php目录下. 下一 ...
- linux php7 mongodb,CentOS 7下安装配置PHP7跟LAMP及MongoDB和Redis
CentOS 7下安装配置PHP7跟LAMP及MongoDB和Redis 我是想能yum就yum,所有软件的版本一直会升级,注意自己当时的版本是不是已经更新了. 首先装CentOS 7 装好cento ...
- php7.4安装配置,CentOS环境下安装配置PHP 7.4的方法
CentOS环境下安装配置PHP 7.4的方法 发布时间:2020-06-19 10:22:32 来源:亿速云 阅读:136 作者:Leah 本文给大家分享的是CentOS环境下安装配置PHP 7.4 ...
- php gearman 定时任务,php使用gearman进行任务分发操作实例详解
php使用gearman进行任务分发操作实例详解,创建一个,客户端,操作,实例,回调 php使用gearman进行任务分发操作实例详解 易采站长站,站长之家为您整理了php使用gearman进行任务分 ...
- 【傻瓜教程】CentOS 7 下 LNMP 环境搭建过程
1.安装MariaDB CentOS 7 下,推荐使用MariaDB(MySQL的一种开源分支),且建议用yum安装. 安装命令 yum -y install mariadb mariadb-serv ...
- PHP7 下安装 memcache 和 memcached 扩展
转载自:https://www.jianshu.com/p/c06051207f6e Memcached 是高性能的分布式内存缓存服务器,而PHP memcache 和 memcached 都是 Me ...
- Centos 7下Nagios的安装及配置(完整版)
Centos 7下Nagios的安装及配置(完整版) 简介 Nagios 是一款自动化运维工具,可以协助运维人员监控服务器的运行状况,并且拥有报警功能.本文章将介绍其安装方法和详细的配置方法. nag ...
- 在Linux上安装Gearman及配置使用Gearman的PHP扩展环境
在Linux上安装Gearman及配置使用Gearman的PHP扩展环境. 先介绍安装 Gearman . 1. 先安装依赖库 # yum install -y boost-devel gperf l ...
- CentOS(linux) 下JDK的安装
CentOS(linux) JDK的安装 第一篇博客有不足之处,请大家多指教.^_^ linux下装JDK的文章网上有一大堆我就不照搬了. 本文讲新手如何取巧的在linux下安装JDK. CentOS ...
- CentOS 7下安装Nextcloud搭建个人网盘
[转载自 https://www.linuxidc.com/Linux/2018-11/155310.htm] 该方法是在linxu公社中发布的.感谢作者! 本人亲测,此方法可行,我在手机.电脑上都可 ...
最新文章
- utf-8 字符串转为Unicode编码格式
- BZOJ 1003 物流运输 最短路+dp
- final const java_Java中的final关键字 与 C#中的const, readonly关键字
- 深度学习《CNN架构续篇 - 学习率衰减》
- 使用vue-cli3创建项目的时候出错,ERROR command failed: npm install --loglevel error --registry
- 电子书下载:Pro ASP.NET MVC2 Framework 2nd
- android可视化编程软件,图形化编程安卓版下载-图形化编程appv1.3.0 最新版下载_飞翔下载...
- Spring核心--容器详解
- 字符串左斜杠替换成右斜杠
- mac OS系统中 设置ssh连接端口
- PIC16F15323单片机 (中断与定时器Timer0)
- android自动识别文字,Android文字识别tesseract ocr -训练样本库 识别字库
- 真无线蓝牙耳机哪个品牌好?2023年真无线降噪耳机盘点
- win10系统桌面快捷方式图标变为白色方块如何解决
- 计算机组成原理简介-(一)概论
- 顺顺网页电子表格控件开源下载
- 学什么编程语言比较好?
- scratch项目:自制电子画板(Scratch画笔类积木、事件类积木中消息广播的应用)
- 用Python画红旗
- 原生混合云 — 经政企打磨方能赢得政企信任
热门文章
- 使用DockerCompose部署Redis分片集群——整合SpringBoot
- 前端绘图开源组件_推荐10款常用的高质量的Web前端UI开源框架,必收藏
- 手把手教你安装VSCode(附带图解步骤)
- Android USB串口通信实现 以及绕过USB弹框验证,50w字+的Android技术类校招面试题汇总
- java中推送异常消息到钉钉群
- 报错:TNS-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序
- 从Lua学习JavaScript(一)
- FFmpeg+SDL2开发播放器遇到问题
- PC端微信多开bat脚本
- PV经典问题之哲学家问题