PHP使用RabbitMQ(正常连接与开启SSL验证后的连接)
代码中包含了PHP在一般情况下使用方法和RabbitMQ开启了SSL验证后的使用方法(我这边消费队列是使用接口请求的方式,每次只从中取出一条)
安装amqp扩展
PHP使用RabbitMQ前,需要安装amqp扩展,之前文章中介绍了Windows环境PHP安装amqp扩展的方法:windows环境PHP使用RabbitMq安装amqp扩展_windows mq扩展安装-CSDN博客
Linux中安装amqp扩展:
### 先进入/usr/local目录下,下载两个文件到此目录(我的PHP版本是7.2):wget -c https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-0.8.0.tar.gzwget -c http://pecl.php.net/get/amqp-1.9.3.tgz### 若使用的docker,将上面下载的两个包 拷贝到容器内【 docker cp ./文件 dockerID:/usr/local】,然后执行下面命令即可### 解压rabbitmq-c-0.8.0.tar.gztar zxf rabbitmq-c-0.8.0.tar.gzcd /usr/local/rabbitmq-c-0.8.0./configure --prefix=/usr/local/rabbitmq-c-0.8.0make && make install### 然后解压 amqp-1.9.3.tgz 解压后amqp-1.9.3文件下内还有个amqp-1.9.3文件夹,将内部的amqp-1.9.3目录拷贝到/usr/local/下,执行下列命令:cd /usr/local/amqp-1.9.3/usr/local/bin/phpize./configure --with-php-config=/usr/local/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.8.0cp /usr/local/rabbitmq-c-0.8.0/librabbitmq/amqp_ssl_socket.h /usr/local/amqp-1.9.3/make && make install### 最后修改php.ini 加上配置:extension = amqp.so
安装后,执行php -m 显示amqp
即表明扩展安装成功!
加载PHP代码的扩展包
然后需要加载代码的扩展包,比较方便快捷的方法是使用composer 加载扩展包
composer require php-amqplib/php-amqplib若想指定版本:composer require php-amqplib/php-amqplib:版本
具体使用哪个版本可以在此链接内查询:https://packagist.org/packages/php-amqplib/php-amqplib
示例代码(包含开启了SSL的连接方式)
<?phpnamespace common\helpers;use models\setting\Log;
use PhpAmqpLib\Connection\AMQPSSLConnection;
use PhpAmqpLib\Exception\AMQPTimeoutException;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;class AmqpHelper
{/*** rabbitMq 未开启ssl验证 消费者* @return false|string|void* @throws \AMQPChannelException* @throws \AMQPConnectionException* @throws \AMQPQueueException* @time 2024/12/2 13:43* @author zsh*/public static function consumerResult(){//队列配置信息$configParams = array('host' => \Yii::$app->params['cotaTct']['queueHost'],'port' => \Yii::$app->params['cotaTct']['queuePort'],'login' => \Yii::$app->params['cotaTct']['queueLogin'],'password' => \Yii::$app->params['cotaTct']['queuePassword'],'vhost' => \Yii::$app->params['cotaTct']['queueVhost']);$conn = new \AMQPConnection($configParams);if (!$conn->connect()) {die("连接rabbitmq失败!\n");}//建立信道$channel = new \AMQPChannel($conn);// 创建队列$q = new \AMQPQueue($channel);$queueName = \Yii::$app->params['cotaTct']['queueName']; //队列名$q->setName($queueName);$q->setFlags(AMQP_DURABLE); // 持久化// 绑定交换机与队列,并指定路由键$q->bind(\Yii::$app->params['cotaTct']['exchange'], \Yii::$app->params['cotaTct']['routingKey']);// 消息获取$ret = $q->get(AMQP_AUTOACK);if ($ret) {
// echo "\nget data:\n";
// var_dump($ret->getBody());
// var_dump(json_decode($ret->getBody(), true));$conn->disconnect();return $ret->getBody();}else{$conn->disconnect();return false;}}/*** rabbitMq 开启ssl了验证 消费者* @return mixed|string|void* @throws \ErrorException* @time 2024/12/2 13:44* @author zsh*/public static function sslConsumerResult(){$configParams = array('host' => \Yii::$app->params['cotaTct']['prodQueueHost'],'port' => \Yii::$app->params['cotaTct']['prodQueuePort'],'login' => \Yii::$app->params['cotaTct']['prodQueueLogin'],'password' => \Yii::$app->params['cotaTct']['prodQueuePassword'],'vhost' => \Yii::$app->params['cotaTct']['queueVhost']);// 创建SSL连接时忽略证书验证$ssl_options = array('verify_peer' => false,'verify_peer_name' => false,);$connection = new AMQPSSLConnection($configParams['host'],$configParams['port'],$configParams['login'],$configParams['password'],$configParams['vhost'],$ssl_options);if (!$connection->isConnected()) {die("连接rabbitmq失败!\n");}
// echo '链接成功...';$queueName = \Yii::$app->params['cotaTct']['queueName']; //队列名$exchange = \Yii::$app->params['cotaTct']['exchange'];$routingKey = \Yii::$app->params['cotaTct']['routingKey'];$channel = $connection->channel();// 声明交换器$channel->exchange_declare($exchange, 'topic', false, true, false);// 获取系统生成的消息队列名称,这里也可以指定一个队列名称$channel->queue_declare($queueName, false, true, false, false);// 将队列名与交换器名进行绑定,并指定routing_key(路由键值)$channel->queue_bind($queueName,$exchange,$routingKey);$message = '';// 定义收到消息回调函数$callback = function ($msg) use (&$message) {
// echo 'Message:'.$msg->body;$message = $msg->body;// 手动确认消息是否正常消费$msg->delivery_info['channel']->basic_Ack($msg->delivery_info['delivery_tag']);};// 设置消费成功后才能继续进行下一个消费$channel->basic_qos(null, 1, null);// 开启消费no_ack=false,设置为手动应答$channel->basic_consume($queueName, '', false, false, false, false, $callback);// 循环进行消费
// while ($channel->is_consuming()) {
// try {
// $channel->wait(null, false, $timeout = 10);
// }catch (AMQPTimeoutException $ex){
// // 没有消息可处理,退出循环
// echo $ex->getMessage();
// break;
// }
// }if ($channel->is_consuming()) {try {$channel->wait(null, false, $timeout = 5);}catch (AMQPTimeoutException $ex){// 没有消息可处理,退出循环echo $ex->getMessage();}}//关闭连接$channel->close();$connection->close();$return = $message;unset($message);$message = null;return $return;}/*** rabbitMq 未开启ssl验证 生产者* @return mixed|string|void* @throws \ErrorException* @time 2024/12/2 13:44* @author zsh*/public static function producer($message){$configParams = array('host' => \Yii::$app->params['cotaTct']['queueHost'],'port' => \Yii::$app->params['cotaTct']['queuePort'],'login' => \Yii::$app->params['cotaTct']['queueLogin'],'password' => \Yii::$app->params['cotaTct']['queuePassword'],'vhost' => \Yii::$app->params['cotaTct']['queueVhost']);$exchangeName = \Yii::$app->params['cotaTct']['producerExchange'];try {$conn = new AMQPStreamConnection($configParams['host'], $configParams['port'], $configParams['login'], $configParams['password']);//创建channel$channel = $conn->channel();$channel->exchange_declare($exchangeName,'fanout',false,true,false);$messageData = new AMQPMessage($message);$channel->basic_publish($messageData, $exchangeName);$channel->close();$conn->close();return true;}catch (\Exception $e){Log::error('AMQP队列错误:'.$e,'AMQP');return false;}}/*** rabbitMq 开启了ssl验证 生产者* @return mixed|string|void* @throws \ErrorException* @time 2024/12/2 13:44* @author zsh*/public static function sslProducer($message){$configParams = array('host' => \Yii::$app->params['cotaTct']['prodQueueHost'],'port' => \Yii::$app->params['cotaTct']['prodQueuePort'],'login' => \Yii::$app->params['cotaTct']['prodQueueLogin'],'password' => \Yii::$app->params['cotaTct']['prodQueuePassword'],'vhost' => \Yii::$app->params['cotaTct']['queueVhost']);$exchangeName = \Yii::$app->params['cotaTct']['producerExchange'];// 创建SSL连接时忽略证书验证$ssl_options = array('verify_peer' => false,'verify_peer_name' => false,);try {$conn = new AMQPSSLConnection($configParams['host'],$configParams['port'],$configParams['login'],$configParams['password'],$configParams['vhost'],$ssl_options);if (!$conn->isConnected()) {die("连接rabbitmq失败!\n");}//创建channel$channel = $conn->channel();$channel->exchange_declare($exchangeName,'fanout',false,true,false);$messageData = new AMQPMessage($message);$channel->basic_publish($messageData, $exchangeName);$channel->close();$conn->close();return true;}catch (\Exception $e){Log::error('AMQP队列错误:'.$e,'AMQP');return false;}}
}
相关文章:
PHP使用RabbitMQ(正常连接与开启SSL验证后的连接)
代码中包含了PHP在一般情况下使用方法和RabbitMQ开启了SSL验证后的使用方法(我这边消费队列是使用接口请求的方式,每次只从中取出一条) 安装amqp扩展 PHP使用RabbitMQ前,需要安装amqp扩展,之前文章中介绍了Windows环…...
轻量级视觉骨干网络 MobileMamba: Lightweight Multi-Receptive Visual Mamba Network
MobileMamba 快速链接解决问题:视觉模型在移动设备端性能和效果的平衡性解决方法:改进网络结构训练和测试策略网络结构改进训练和测试策略 实验支撑:图像分类、分割,目标检测等图像分类结果对比目标检测和实例分割结果对比语义分割…...
科技云报到:数智化转型风高浪急,天翼云如何助力产业踏浪而行?
科技云报到原创。 捷径消亡,破旧立新,是今年千行百业的共同底色。 穿越产业周期,用数字化的力量重塑企业经营与增长的逻辑,再次成为数字化技术应用的主旋律,也是下一阶段产业投资的重点。 随着数字化转型行至“深水区…...
dockerfile部署前后端(vue+springboot)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言0.环境说明和准备1.前端多环境打包1.1前端多环境设置1.2打包 2.后端项目多环境配置以及打包2.1后端多环境配置2.2项目打包 3.文件上传4.后端镜像制作4.1dockerf…...
c语言的思维导图
之前已经全部学完c语言了,所以为了更好的复习回顾,我做了一份c语言超详细的思维导图,帮助实现一张图就可以复习,避免盲目, 由于平台不支持直接发上图,有想要的小伙伴,可以私信找我要原件...
Android 拍照(有无存储权限两种方案,兼容Q及以上版本)
在某些行业,APP可能被禁止使用存储权限,或公司在写SDK功能,不方便获取权限 所以需要有 无存储权限拍照方案。这里两种方案都列出里。 对于写入权限,在高版本中,已经废弃, 不可用文件写入读取权限…...
MongoDB在自动化设备上的应用示例
发现MongoDB特别适合自动化检测数据的存储。。。 例如一个晶圆检测项目,定义其数据结构如下 #pragma once #include <vector> #include <QString> #include <QRectF> #include <string> #include <memory>class tpoWafer; class tp…...
draggable插件——实现元素的拖动排序——拖动和不可拖动的两种情况处理
最近在写后台管理系统的时候,遇到一个需求,就是关于拖动排序的功能。 我之前是写过一个关于拖动表格的功能,此功能可以实现表格中的每一行数据上下拖动实现排序的效果。 vue——实现表格的拖拽排序功能——技能提升 但是目前我这边的需求是…...
Redux的使用
到如今redux的已经不是react程序中必须的一部分内容了, 我们应该在本地需要大量更新全局变量时才使用它! redux vs reducer reducer的工作机制: 手动构造action对象传入dispatch函数中 dispatch函数将 action传入reducer当中 reducer结合当前state与a…...
【JAVA】Java高级:多数据源管理与Sharding:数据分片(Sharding)技术的实现与实践
大规模分布式系统,数据存储和管理变得越来越复杂。随着用户数量和数据量的急剧增加,单一数据库往往难以承载如此庞大的负载。这时,数据分片(Sharding)技术应运而生。数据分片是一种将数据水平切分到多个数据库实例的技…...
ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )
一、结论 💢先看结论吧, MapStaticAssets 在大多数情况下可以替换 UseStaticFiles,它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置(如磁盘或嵌入资源)的资产,则应…...
LeetCode刷题day18——贪心
LeetCode刷题day18——贪心 135. 分发糖果分析: 406. 根据身高重建队列分析:for (auto& p : people) 昨天写了一道,今天写了一道,都有思路,却不能全整对。昨天和小伙伴聊天,说是因为最近作业多…...
MATLAB Simulink® - 智能分拣系统
系列文章目录 前言 本示例展示了如何在虚幻引擎 环境中对四种不同形状的标准 PVC 管件实施半结构化智能分拣。本示例使用 Universal Robots UR5e cobot 执行垃圾箱拣选任务,从而成功检测并分类物体。cobot 的末端执行器是一个吸力抓手,它使 cobot 能够拾…...
linuxCNC(五)HAL驱动的指令介绍
HAL驱动的构成 指令举例详解 从终端进入到HAL命令行,执行halrun,即可进入halcmd命令行 # halrun指令描述oadrt加载comoonent,loadrt threads name1 period1创建新线程loadusr halmeter加载万用表UI界面loadusr halscope加载示波器UI界面sho…...
STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期
需求分析 上一个案例我们输出了PWM波,这个案例我们使用输入捕获功能,来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑,检查测试的结果。 如何测量 1、输入捕获功能主要是:测量输入通道的上升沿和下降沿 2、让第一个…...
第一节、电路连接【51单片机-TB6600驱动器-步进电机教程】
摘要:本节介绍如何搭建一个51单片机TB6600驱动器步进电机控制电路,所用材料均为常见的模块,简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制系统 ②USB转TTL模块 ③开关电源 ④TB6600步进电机驱动器 ⑤二相四线步进电机 ⑥电…...
【通俗理解】Koopman算符与非线性动力系统分析
【通俗理解】Koopman算符与非线性动力系统分析 关键词: #Koopman算符 Koopman Operator #非线性动力系统 Nonlinear Dynamical System #无穷维线性算子 Infinite-Dimensional Linear Operator #演化分析 Evolution Analysis #Bernard Koopman Bernard Koopman 第…...
mybatis plus打印sql日志
1、官方文档 使用配置 | MyBatis-Plus 2、日志实现 MyBatis-Plus 提供了多种日志实现(log-impl),用于记录 SQL 语句和相关操作,帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明: StdOutImpl…...
ObjectMapper
ObjectMapper 是 Jackson 库中非常重要的一个类,它是 JSON 和 Java 对象之间进行序列化与反序列化的核心工具。ObjectMapper 的底层实现是基于 Jackson 的数据绑定模型,它将 Java 对象与 JSON 数据转换为互通格式。 1. ObjectMapper 的设计与核心功能 O…...
新增白名单赋予应用安装权限
目录 相关问题 具体实现 相关问题 安装app到/data/分区时,如何在安装阶段就赋予权限,无需请求权限 具体实现 frameworks/base/core/res/res/values/config.xml <!-- For whitelis apk --><string-array translatable"false" nam…...
qmcdump:专业解决QQ音乐加密音频格式兼容性问题
qmcdump:专业解决QQ音乐加密音频格式兼容性问题 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 在数字音乐时…...
前端工程化实战:基于 Kelivo 模板的配置即代码与自动化工作流
1. 项目概述与核心价值最近在整理个人开发环境时,发现一个挺有意思的项目,叫Chevey339/kelivo。乍一看这个仓库名,可能有点摸不着头脑,但点进去之后,你会发现它是一个围绕特定开发工具或框架进行深度定制、优化和功能增…...
轻量级工作流引擎pro-workflow:Go语言实现与实战解析
1. 项目概述:一个为专业开发者量身打造的工作流引擎如果你是一名开发者,尤其是经常需要处理复杂业务逻辑、数据流转或自动化任务的后端或全栈工程师,那么你一定对“工作流”这个概念不陌生。从简单的审批流到复杂的微服务编排,工作…...
终极指南:如何为你的Mac鼠标安装强大定制功能
终极指南:如何为你的Mac鼠标安装强大定制功能 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款革命性的开源工具…...
AI智能体记忆系统设计:从RAG到长期记忆的工程实践
1. 项目概述:从“记忆”到“智能”的跨越在AI智能体(Agent)的开发浪潮中,我们常常面临一个核心挑战:如何让智能体在复杂的、多轮次的交互中,表现得像一个真正有“记忆”和“经验”的专家?传统的…...
ARM Cortex-A5 SCU架构与多核缓存一致性解析
1. ARM Cortex-A5 SCU架构解析SCU(Snoop Control Unit)是Cortex-A5多核处理器中的关键组件,主要负责维护多核间的缓存一致性。当某个CPU核心修改了共享内存区域的数据时,SCU会自动通知其他核心的缓存进行更新或失效操作。这种机制…...
gifuct-js:高性能JavaScript GIF解码器的架构设计与性能优化策略
gifuct-js:高性能JavaScript GIF解码器的架构设计与性能优化策略 【免费下载链接】gifuct-js Fastest javascript .GIF decoder/parser 项目地址: https://gitcode.com/gh_mirrors/gi/gifuct-js gifuct-js是一个专注于高效GIF文件解析与解码的JavaScript库&a…...
航空发电机综合测试系统设计【附代码】
✨ 长期致力于航空发电机、测试系统、控制方法、LabVIEW研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)设计直流拖动调速系统的双闭环自适应模糊PID控…...
开源中国双核战略:AI普惠生态的破局之道
当全球AI产业进入深水区,技术突破与商业落地之间的鸿沟日益凸显。开源中国以"模力方舟"和"口袋龙虾"双核驱动战略,正在构建一个从云端到终端的完整AI应用生态,为中国AI产业提供了一条独特的普惠化路径。这一战略不仅解决…...
Steam-Economy-Enhancer多货币支持:全球交易定价策略
Steam-Economy-Enhancer多货币支持:全球交易定价策略 【免费下载链接】Steam-Economy-Enhancer Enhances the Steam Inventory and Steam Market. 项目地址: https://gitcode.com/gh_mirrors/st/Steam-Economy-Enhancer Steam-Economy-Enhancer是一款强大的S…...
