查询输入66946个字符后,Php+连接持续失效



我一直在尝试调试php项目中一个随机丢弃的mysql连接。

到目前为止我发现的东西:

  • 一旦通过单个mysql连接的输入(在通过单个mysql连接的查询中使用的总字符数(通过66946个字符,php就会无限期地锁定导致它通过的查询
  • 如果我偶尔重新连接mysql服务器,而不是一直重新使用现有的连接,那么只要我在任何一个mysql连接的输入中不超过66946个字符,mysql连接就不会断开
  • 无论是单个查询,还是一堆小查询,都无关紧要。一旦";66947〃;阈值在单个mysql连接上传递,php将无限期挂起
  • 这不是内存问题。Php最多只占用10Mb的内存,最大内存为512Mb
  • mysql连接是远程的,如果这很重要的话
  • 这段代码适用于我的本地开发环境(具有任何长度的查询,相同的远程连接(,但不适用于查询长度超过66946个字符的生产服务器
  • php版本&我的开发环境和实时环境的配置文件是相同的,并且都在运行Ubuntu(好吧,从技术上讲,在本地是WSL(
  • 在mysqli和PDO之间切换并没有什么显著的区别(只是在崩溃之前输入的字符数不同,PDO的字符数比mysqli少(
  • (更新(:我还在另一个类似的ubuntu主机上尝试了这个脚本,该主机使用相同版本的PHP,使用相同的mysql主机。它在那里完美地工作。。。所以我真的不知道问题可能是什么

我已经将其缩小到这个最小复制情况:

<?php
if ( ! empty($argv[1])) {
$count = intval($argv[1]);
}
if (empty($count) || $count < 34) {
$count = 34;
}
$longText         = str_repeat("a", $count - 34);
$query            = "select * from abcdef limit 1/* {$longText} */"; // where "abcdef" is my table name
$mysqliConnection = mysqli_connect("my_host", "my_username", "my_password", "my_database");
echo "query length: " . strlen($query);
$result = mysqli_query($mysqliConnection, $query);
echo "nnSuccess!nn";

如果自变量CCD_ 1返回"0";成功"66947只会使生产服务器无限期挂起(但在我的本地机箱中运行良好!(。

为什么我的php-mysql连接有一些神秘的输入限制?我如何才能阻止它(不管"它"是什么(限制我的php-mysql连接输入长度?

您可能正在寻找max_allowed_packet。它在my.cnf中定义。

使用SHOW VARIABLES LIKE 'max_allowed_packet';进行检查。

事实证明,服务器的路由表中存在错误配置。修复路由表解决了问题。

花了很多小时才得出这个结论,一切都指向php-fpm或mysql设置配置错误,我甚至不认为这可能是路由问题。希望这对将来的某个人有所帮助。

最新更新