Php + mysql - 连接在查询输入 66,946 个字符后持续终止
Php + mysql - connection dies consistantly after 66,946 chars of query input
我一直在尝试调试 php 项目中随机掉线的 mysql 连接。
到目前为止我发现的事情:
- 一旦通过单个 mysql 连接的输入(通过单个 mysql 连接的查询中使用的总字符数)超过 66,946 个字符,php 就会无限期地锁定查询导致它过去了。
- 如果我偶尔重新连接 mysql 服务器而不是一直重新使用现有连接,只要我不超过 66946,mysql 连接就不会断开任何单个 mysql 连接的输入中的字符。
- 无论是单个查询还是一堆小查询都没有关系。一旦在单个 mysql 连接上超过“66947”阈值,php 将无限期挂起。
- 这不是内存问题。 Php最多只占用10Mb内存,最大内存为512Mb
- mysql 连接是远程的,如果这很重要的话。
- 这段代码适用于我的本地开发环境(任意长度的查询,相同的远程连接),但不适用于生产服务器,查询总长度超过 66,946 个字符
- 我的开发环境和实时环境的 php 版本和配置文件是相同的,并且都是 运行 Ubuntu(好吧,在本地它在技术上是 WSL)
- 在 mysqli 和 PDO 之间切换没有显着差异(只是崩溃前输入字符的数量不同,PDO 的字符数少于 mysqli)
- (更新):我还在另一台具有相同版本 PHP 的类似 ubuntu 主机上尝试了此脚本,使用相同的 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
returns“成功!”立即,66947
只会让生产服务器无限期挂起(但在我的本地机器上工作正常!)。
为什么我的 php mysql 连接有一些神秘的输入限制?我怎样才能阻止它(无论“它”是什么)限制我的 php mysql 连接输入长度?
您可能正在寻找 max_allowed_packet
。它在 my.cnf
.
中定义
使用SHOW VARIABLES LIKE 'max_allowed_packet';
检查一下。
事实证明服务器的路由 table 存在错误配置。修复路由 table 解决了问题。
花了好几个小时才得出这个结论,一切都指向 php fpm 或 mysql 设置配置错误,我什至不认为这可能是路由问题。希望这对以后的人有所帮助。
我一直在尝试调试 php 项目中随机掉线的 mysql 连接。
到目前为止我发现的事情:
- 一旦通过单个 mysql 连接的输入(通过单个 mysql 连接的查询中使用的总字符数)超过 66,946 个字符,php 就会无限期地锁定查询导致它过去了。
- 如果我偶尔重新连接 mysql 服务器而不是一直重新使用现有连接,只要我不超过 66946,mysql 连接就不会断开任何单个 mysql 连接的输入中的字符。
- 无论是单个查询还是一堆小查询都没有关系。一旦在单个 mysql 连接上超过“66947”阈值,php 将无限期挂起。
- 这不是内存问题。 Php最多只占用10Mb内存,最大内存为512Mb
- mysql 连接是远程的,如果这很重要的话。
- 这段代码适用于我的本地开发环境(任意长度的查询,相同的远程连接),但不适用于生产服务器,查询总长度超过 66,946 个字符
- 我的开发环境和实时环境的 php 版本和配置文件是相同的,并且都是 运行 Ubuntu(好吧,在本地它在技术上是 WSL)
- 在 mysqli 和 PDO 之间切换没有显着差异(只是崩溃前输入字符的数量不同,PDO 的字符数少于 mysqli)
- (更新):我还在另一台具有相同版本 PHP 的类似 ubuntu 主机上尝试了此脚本,使用相同的 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
returns“成功!”立即,66947
只会让生产服务器无限期挂起(但在我的本地机器上工作正常!)。
为什么我的 php mysql 连接有一些神秘的输入限制?我怎样才能阻止它(无论“它”是什么)限制我的 php mysql 连接输入长度?
您可能正在寻找 max_allowed_packet
。它在 my.cnf
.
使用SHOW VARIABLES LIKE 'max_allowed_packet';
检查一下。
事实证明服务器的路由 table 存在错误配置。修复路由 table 解决了问题。
花了好几个小时才得出这个结论,一切都指向 php fpm 或 mysql 设置配置错误,我什至不认为这可能是路由问题。希望这对以后的人有所帮助。