PHP RabbitMQ连接超时问题

news2024/12/24 8:37:15

问题背景

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.coloradmin.cn/o/2255597.html

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

相关文章

【LeetCode热题100】BFS解决FloodFill算法

这篇博客主要记录了使用BFS解决FloodFill算法的几道题目&#xff0c;包括图像渲染、岛屿数量、岛屿的最大面积、被包围的区域。 class Solution {using PII pair<int, int>; public:vector<vector<int>> floodFill(vector<vector<int>>& im…

L2G3000-LMDeploy 量化部署实践

文章目录 LMDeploy 量化部署实践闯关任务环境配置W4A16 量化 KV cacheKV cache 量化Function call LMDeploy 量化部署实践闯关任务 环境配置 conda create -n lmdeploy python3.10 -y conda activate lmdeploy conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.…

大数据新视界 -- 大数据大厂之 Hive 临时表与视图:灵活数据处理的技巧(上)(29 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Ubuntu操作系统在Vmware中的安装、常用操作、最基础的知识、imx6ll基本开发环境配置

01-Ubuntu操作系统的安装 网盘搜索 “ubuntu18.04.zip”&#xff0c;下载下来之后用Vmware打开就行了。 我用的虚拟机是15.5.6&#xff0c;实测没有问题。 启动时用户名为book的密码为123456 提问&#xff1a;Ubuntu与Centos系统有何区别&#xff1f; 详情见 https://blog.cs…

windows2012服务器安装sqlserver2012出现NetFx3错误的解决方法。

出现以下错误: 启用 Windows 功能 NetFx3 时出错&#xff0c;错误代码: -2146498298。请尝试从 Windows 管理工具启用 Windows 功能 NetFx3&#xff0c;然后重新运行安装程序。有关如何启用 Windows 功能的详细信息&#xff0c;具体解决办法如下&#xff1a; 1、打开PowerShel…

FPGA实战篇(按键控制LDE实验)

1.按键简介 按键开关是一种电子开关&#xff0c;属于电子元器件类。我们的开发板上有两种按键开关&#xff1a;第一种是本实验所使用的轻触式按键开关&#xff0c;简称轻触开关。使用时以向开关的操作方向施加压力使内部电路闭合接通&#xff0c;当撤销压力时开关断开&#xff…

C++析构函数和构造函数

一、构造函数 1.构造函数的基本概念 1.对构造函数的理解&#xff1a; 构造函数是类的一种特殊成员函数&#xff0c;其主要功能是在创建对象时进行初始化操作。它的名字与类名相同&#xff0c;并且没有返回值类型&#xff08;不能是void&#xff09;。例如&#xff0c;对于一个…

【Axure高保真原型】数值条件分组

今天和大家分享数值条件分组的原型模板&#xff0c;效果包括&#xff1a; 点击添加分组按钮&#xff0c;可以显示添加弹窗&#xff0c;填写分组名称和数值区间后&#xff0c;可以新增该分组信息‘’ 修改分组区间&#xff0c;可以直接在输入框里修改已有的分组区间&#xff0c…

阳光电脑公司的维修服务微信小程序ssm+论文源码调试讲解

第2章 开发环境与技术 阳光电脑公司的维修服务微信小程序的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对阳光电脑公司的维修服务微信小程序用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&…

重生之我在异世界学编程之C语言:深入结构体篇(下)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言结构体的自引用实现链表一、链表的基…

使用Redis Stream偶发空指针问题

问题描述&#xff1a;使用redission客户端封装的stream消息队列&#xff0c;在进行消息轮询时&#xff0c;偶发出现空指针问题。 [2024-11-13 09:59:20] [] [] [redis-stream-consumer-thread-1 ] [lambda$streamMessageListenerContainer$1] [ERROR] [c.r.c.r.s.config.Redi…

35页PDF | 元数据与数据血缘落地实施(限免下载)

一、前言 这份报告详细介绍了元数据与数据血缘的概念、重要性以及在企业数据中台中的应用。报告阐述了数据中台的核心价值在于整合和管理体系内的数据&#xff0c;以提升数据资产化能力并支持业务决策。报告还涵盖了元数据的分类&#xff08;技术元数据和业务元数据&#xff0…

方案精读:50页智慧园区数字化平台总体规划与建设方案PPT

本文介绍了智慧园区数字化平台总体规划与建设方案&#xff0c;包括智慧园区工业云平台、智慧办公平台、智能工厂、智慧能源管理、智慧政务管理等方面的建设内容。方案旨在通过技术手段加强园区内部沟通和管理能力&#xff0c;实现个性化营销、柔性化制造、高效智能协同的供应链…

深入浅出:Go语言标准库探索

深入浅出&#xff1a;Go语言标准库探索 引言 Go语言自发布以来&#xff0c;以其简洁的语法、高效的性能和强大的并发支持赢得了开发者的青睐。除了这些特性外&#xff0c;Go还拥有一个功能丰富且设计精良的标准库&#xff0c;几乎涵盖了现代应用程序开发所需的所有基本功能。…

python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容

废话不多说&#xff0c;直接开始 本文以无界作为本文测试案例&#xff0c;抓取shadow-root&#xff08;open&#xff09;下的内容 shadow Dom in selenium&#xff1a; 首先先讲一下shadow Dom in selenium 版本的区别&#xff0c;链接指向这里 在Selenium 4版本 以及 chrom…

1207论文速读

1、SCN_GNN: A GNN-based fraud detection algorithm combining strong node and graph topology information 全文总结&#xff1a;本文介绍了一种基于图神经网络的欺诈检测算法——SCN_GNN。在欺诈检测中&#xff0c;由于欺诈者经常使用多种关系类型来掩盖其活动&#xff0c…

5.3_小程序渗透

小程序 行为工具小程序抓包全局代理&#xff0c;Proxifer小程序渗透小程序反编译Wxapkg 参数&#xff1a;scan 联网自动扫描&#xff0c;-r 指定 wx文件路径小程序逆向WeChatOpenDevTools 小程序抓包 工具步骤 全局代理 Burp中Proxy setings导出证书选择 Select file &a…

怎么实现邮件营销自动化?

邮件营销能够出色地帮助我们与客户建立良好关系。无论是新客户还是老客户&#xff0c;都可以通过邮件来达成较为良好的客户关系。然而&#xff0c;从消费者的角度来看&#xff0c;每个人都有自己独特的习惯和特点&#xff0c;没有人希望收到千篇一律、营销意味过重的邮件。因此…

使用ensp搭建内外互通,使用路由跨不同vlan通信。

1.网络拓扑图 2.规则 &#xff08;1&#xff09;允许 &#xff08;自己&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以. &#xff08;2&#xff09; 允许&#xff08;电信&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以 &#xff08;时间问题不做…

鸿蒙分享(一):添加模块,修改app名称图标

码仓库&#xff1a;https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 新建公共模块common 在entry的oh-package.json5添加dependencies&#xff0c;引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&…