PHP MYSQL Packets out of order. Expected 1 received 0. Packet size=

本地环境(windows)测试没有问题,部署到线上测试环境(linux)的时候,分别报错:

  1. mysql server has gone away
  2. Packets out of order. Expected 1 received 0. Packet size=

查阅网上资料,大部分是让修改my.cnf的配置,比如max_allow_packgewait_timeout等,但是依然无效,而且考虑到其它项目也是用的此数据库测试,排除数据库原因,测试环境为共用的docker容器跑的,其它项目正常,排除环境问题,剩下代码部分。经检索,发现有前人答复:

pcntl_fork前不要连数据库,否则就会报MySQL server has gone away错误。
原因是子进程会继承主进程的数据库连接,当mysql返回数据时,这些子进程都可以通过这个连接读到数据,
造成数据错乱。

发现代码确实用到了子进程,采用其它方式替换后,测试通过。

总结:之所以在windows上没有发现,应该是https://www.php.net/manual/zh/pcntl.installation.php

### MySQL 连接服务器失败分析 当遇到 `com.mysql.cj.jdbc.exceptions.CommunicationsException: 通信链路故障` 错误时,表明客户端与MySQL服务器之间的网络连接存在问题[^3]。具体表现为最后一个数据包发送成功到服务器的时间是0毫秒前,驱动没有收到任何来自服务器的数据包。 #### 可能原因 1. **网络配置问题** - 客户端和服务器之间可能存在防火墙或其他网络安全设备阻止了通信。 2. **超时设置不当** - 如果应用程序设置了过短的连接或读取超时时间,在高延迟情况下可能导致此错误。 3. **DNS解析失败** - 若主机名无法正确解析成IP地址,则会引发类似的通讯中断现象。 4. **服务未启动/监听端口不匹配** - 确认MySQL Server已正常运行并正在侦听预期中的TCP/IP端口号(默认为3306)。 5. **资源耗尽** - 当大量并发请求涌入时可能会消耗掉所有的可用连接数或者内存资源,从而影响新建立的链接尝试。 #### 解决方法建议 为了排查上述提到的各种可能性: - 检查本地机器能否通过命令行工具telnet访问远程数据库实例所处位置以及指定端口是否开放; - 查看my.cnf文件内的timeout参数设定是否合理; - 调整JDBC URL字符串里附加属性部分来增加重试次数、延长等待间隔等措施提高稳定性。 ```java String url = "jdbc:mysql://localhost:3306/test?connectTimeout=3000&socketTimeout=6000"; Connection conn = DriverManager.getConnection(url,"root",""); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值