我一直在尝试在我的 php 项目中调试随机删除的 mysql 连接。
到目前为止我发现的事情:
- 一旦通过单个 mysql 连接的输入(通过单个 mysql 连接的查询中使用的总字符)通过了 66,946 个字符,php 就会无限期地锁定导致它结束的查询。
- 如果我偶尔重新连接 mysql 服务器而不是一直重新使用现有连接,只要我在任何单个 mysql 连接的输入中不超过 66946 个字符,mysql 连接就不会断开。
- 无论是单个查询还是一堆小查询都没有关系。一旦在单个 mysql 连接上通过了“66947”阈值,php 就会无限期挂起。
- 这不是内存问题。php最多只占用10Mb的内存,最大内存为512Mb。
- mysql 连接是远程的,如果这很重要的话。
- 这个确切的代码适用于我的本地开发环境(具有任意长度的查询,相同的远程连接),但不适用于生产服务器上的查询加起来超过 66,946 个字符
- 我的开发环境和实时环境的 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 "\n\nSuccess!\n\n";
提供参数66946
返回“成功!” 立即,并且66947
只是使生产服务器无限期挂起(但在我的本地盒子中工作正常!)。
为什么我的 php mysql 连接有一些神秘的输入限制?如何阻止它(无论“它”是什么)限制我的 php mysql 连接输入长度?