PHP RabbitMQ连接超时问题

问题背景

Error: The connection timed out after 3 sec while awaiting incoming data

看到这个报错,我不以为意,认为是我设置的超时时间不够导致的,那就设置长一点

Error: The connection timed out after 300 sec while awaiting incoming data

当我等待了300秒看到了这个报错,我眉头一皱,此事比不简单。

错误分析

很明显这个问题有几种可能,我一一排查

因为我是从测试环境转到生产环境的,代码一样,测试环境没有问题,只是RabbitMQ不一样。

首先测试MQ是否能通

使用telnet 命令测试,发现不能通,原来是生产环境的MQ加了IP限制。把IP加到白名单后能通,但是代码连接仍然超时。

测试我怀疑是不是给过来的端口不对,因为测试环境的端口是5672,这个是默认端口,而生产环境的端口是5671,修改端口后发现端口不通,连接失败,拒绝连接。那就端口没有问题

接着我认为可能是账号密码不对,修改后发现报错还是超时,说明代码都还没连上RabbitMQ。

​​​​​​连接代码​​​

 此时我去网上寻找答案,恰巧也有人跟我遇到了类似的问题,在github上向开发者提了Issuses

PHP 致命错误:未捕获的异常“PhpAmqpLib\Exception\AMQPTimeoutException”,并显示消息“在等待传入数据时,连接在 3 秒后超时” ·问题 #839 ·php-amqplib/php-amqplib ·GitHub的

其中这个提问跟我遇到的问题完全一致

 

扩展的开发者也对这个问题进行了答复,从这里我就知道这个问题跟SSL有关系了,同时还提供了样例php-amqplib/demo/ssl_connection.php at master · php-amqplib/php-amqplib · GitHub

根据这个样例不难看出是要我们使用ssl进行连接,因为MQ的5671端口是支持SSL的。

可是很多人都跟我一样,没有这个证书,或者说即使有也不知道怎么使用。确实,我也是一脸懵,就像开发者说的,你需要深入学习一下TLS/SSL的工作原理

当然了,这都不是我们的重点,重点是解决当前遇到的问题。

有了样例,那我们直接拿过来用

$sslOptions = array('cafile' => CERTS_PATH . '/ca_certificate.pem','local_cert' => CERTS_PATH . '/client_certificate.pem','local_pk' => CERTS_PATH . '/client_key.pem','verify_peer' => true,'verify_peer_name' => false,
);$connection = new AMQPSSLConnection(HOST, 5671, USER, PASS, VHOST, $sslOptions);

此时会发现能连上了,但是运行会提示一个信息

不是吧!我刚找的解决方案你就打算弃用了,也不难理解。为什么同样是连接却要用两种方法实现,随着我查看源码我就发现了。

 先看最开始连接的方法:AMQPStreamConnection

一般很少人会去看这个,因为这个方法只有前面4个参数是必填的,后面都有默认值,例如最开始报错超时3秒也是在这设置。这里我们就看到在参数里篇有个$ssl_protocol和?AMQPConnectionConfig $config两个参数,不难看出这个就是能够支持SSL的,这也是AMQPSSLConnection方法会弃用的原因,不然我本地用着AMQPStreamConnection方法好好的,到其他地方,用不了了。

知道了AMQPStreamConnection可以支持SSL了,我们看一下AMQPConnectionConfig类

这个类是用来设置连接参数的 

根据样例我们不难设置这个ssl相关的数据,不过因为我没有证书,所以自然不用去管这个。

接下来回头看看支持SSL的类AMQPSSLConnection

对的,你没看错,AMQPSSLConnection继承了AMQPStreamConnection,合着搞了大半天你们本来就是一起的。这里我们看到$ssl_options参数就是样例中ssl参数配置的位置

弄完之后AMQPSSLConnection又构建父类初始化,就是还是AMQPSSLConnection,把ssl参数加上,加的参数位置是$context,直接把方法拿过来用就可以了

 AMQPSSLConnection并没有用AMQPConnectionConfig来设置ssl参数,那我们也可以不用,直接整

解决方案

        $sslOptions = array('verify_peer' => false,);$ssl_context = stream_context_create();foreach ($sslOptions as $k => $v) {stream_context_set_option($ssl_context, 'ssl', $k, $v);}$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection($config['host'],$config['port'],$config['user'],$config['password'],'/',false,'AMQPLAIN',null,'en_US',3.0,3.0,$ssl_context);

看到没,verify_peer设置为false,是不是很眼熟,就是平时我们在https请求时忽略证书校验那样。至于AMQPConnectionConfig类设置参数这个我就不再细细研究了,原理是一样的。

verify_peer:验证证书是否对等,也就是是否需要校验证书的意思,设置为true就是要校验。

要校验就申请CA证书或者自签证书,放在参数里即可。

我这都没给我提供就懒得去折腾了,解决问题即可,遇到问题我们再解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core过滤器应用

筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器,用于系统授权。一般不会编写自定义的授权过滤器,而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…

Linux DNS解释器

作用 DNS(Domain Name System)是互联网上的一项服务,用于将域名和IP地址进行相互映射,使人 更方便的访问互联网 正向解析:域名->IP 反向解析:IP->域名 连接方式 DNS使用53端口监听网络 查看方法&a…

3.STM32通信接口之SPI通信---SPI实战(W25Q64存储模块介绍)《精讲》

上一节介绍了SPI的通信过程和方法,接下来就要进行STM32与外围模块通信了,这个模块是一块非易失型存储芯片,能够提供8MB的存储空间。接下来跟着Whappy脚步,进行探索新大陆吧!【免费】W25Q64(中英文数据手册)资源-CSDN文…

嵌入式系统应用-LVGL的应用-平衡球游戏 part2

平衡球游戏 part2 4 mpu60504.1 mpu6050 介绍4.2 电路图4.3 驱动代码编写 5 游戏界面移植5.1 移植源文件5.2 添加头文件 6 参数移植6.1 4 mpu6050 4.1 mpu6050 介绍 MPU6050是一款由InvenSense公司生产的加速度计和陀螺仪传感器,广泛应用于消费电子、机器人等领域…

java将word docx pdf转换为图片(不需要额外下载压缩包,直接导入maven坐标)

(本代码实现的是将第1页转为图片,主要用于制作文件缩略图) pdf转图片容易 docx转图片麻烦,看其他博客可以直接导入maven坐标,但我知道那是需要付费且有时限的包 本着简单实用的心,我找到法子了 pdf转图片:有库直接转…

C#学写了一个程序记录日志的方法(Log类)

1.错误和警告信息单独生产文本进行记录; 2.日志到一定内存阈值可以打包压缩,单独存储起来,修改字段MaxLogFileSizeForCompress的值即可; 3.Log类调用举例:Log.Txt(JB.信息,“日志记录内容”,"通道1"); usi…

linux(centos) 环境部署,安装JDK,docker(mysql, redis,nginx,minio,nacos)

目录 1.安装JDK (非docker)1.1 将文件放在目录下: /usr/local/jdk1.2 解压至当前目录1.3 配置环境变量 2.安装docker2.1 验证centos内核2.2 安装软件工具包2.3 设置yum源2.4 查看仓库中所有docker版本,按需选择安装2.5 安装docker2.6 启动docker 并 开机…

电阻改善信号完整性

1.为什么电路端接电阻能改善信号完整性 由于电信号在PCB上传输,因此在PCB设计中可以把PCB走线认为是信号的通道,当该通道的 物理结构(线宽,线到参考面的距离等)发生变化,特别是有一些突变时,都会…

Java基础面试题,46道Java基础八股文(4.8万字,30+手绘图)

Java是一种广泛使用的编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)在1995年首次发布。它是一种面向对象的语言,这意味着它支持通过类和对象的概念来构造程序。 Java设计有一个核心理念:“编写一次&am…

记录下nginx接口代理配置问题

其中api和api1是前面定义的upstream,ip相同只是端口不同。 一开始/api1/直接 像api一样 proxy_pass http://api1这样是不行的,因为会代理到 后端的 /api1/...接口,而后端实际接口地址是 /api/..... 所以必须像上面写法才能将外网的 /api…

高效流程图绘制:开发设计流程图利器

在选择画流程图的工具时,不同的项目和使用场景会决定最佳的工具。以下是几款常见的流程图工具,并结合具体项目使用场景提供建议: 1. Lucidchart 特点: 在线协作:支持多人实时协作,适合团队合作。模板丰富&…

【Python网络爬虫笔记】7-网络爬虫的搜索工具re模块

目录 一、网络爬虫中的正则表达式和re模块(一)数据提取的精确性(二)处理复杂的文本结构(三)提高数据处理效率 二、正则表达式的内涵(一)、常用元字符(二)、量…

Day4:生信新手笔记 — R语言简单命令与Rstudio配置

一、Rstudio的界面展示 (很像Matlab风格) 二、Rstudio设置字体大小 三、 用Rproject管理工作目录 工作目录(working directory) 即当前所在的目录,是脚本、图片、文件的默认保存位置,也是文件读取的默认位置。R语言只能和一个文件夹进行互动&#xff0…

koa中间件

文章目录 1. koa中间件简介2. 中间件类型1. 应用级中间件2. 路由级中间件3. 错误处理中间件4. 第三方中间件 3.中间件执行流程 1. koa中间件简介 在Koa中,中间件呈现为一个异步函数,该函数支持 async/await 语法,它接收两个参数:…

【开源】A060-基于Spring Boot的游戏交易系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…

泷羽sec:shell编程(9)不同脚本的互相调用和重定向操作

声明: 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

Pod Pending无法调度

根据您提供的Kubernetes调度警告信息,以下是可能的原因分析: Insufficient Memory: 有1个节点因为内存不足而无法调度Pod。这可能是因为该节点上已经运行的Pod消耗了大量内存,没有足够的资源来运行新的Pod。 Pod Affinity/Anti-Affinity: 有…

QT 左右 上下,拉伸 分配窗口大小

要的效果是以下: QT C 两个QWideget A B现在有放在一个窗口QWideget Test内,初始比例要2:8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时,有条线,可以左右移动来控件 A B 窗口所占的大小widgetB (有 wi…

pyqt6简单应用

from PyQt6.QtWidgets import QWidget,QPushButton,QLineEdit,QLabel,QApplication from PyQt6.QtGui import QPixmap,QIcon,QCursor from PyQt6.QtCore import Qt from PyQt6 import QtCoreimport sysclass Ui_window(QWidget):def __init__(self):super().__init__()# 设置窗…

【Spring篇】初始Spring MVC框架之Spring MVC入门程序编写

🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯Spring MVC概述 …