所以当我运行PHP PDO的脚本时,我遇到了这个问题,我无法解决。我的脚本是从不同服务器上的不同数据库索引信息(主要是选择查询)。
当我开发脚本时,所有数据库都在同一台服务器上,一切运行正常。现在我在三个不同的服务器上移动数据库,我得到了这个可怕的错误。
所以每次运行我的脚本时都会发生这种情况:
脚本运行正常,直到它运行这个简单查询的一个点(并且每次都崩溃):
(注意,脚本位于PHP
,我正在使用PHP PDO
访问我的数据库并使用它。)
SELECT *
FROM a_table
WHERE a_column = a_value.
然后它崩溃了,我收到了这个错误:
[a_date] - trunk - FATAL - Unmanaged Exception of type 'App_Exception'
File: /.../.../.../a_php_file.php
Line: a_line
Message: Error executing query.
Info:
Array
(
[0] => HY000
[1] => 2006
[2] => MySQL server has gone away
)
Trace:
#0 /.../.../.../a_php_file.php(124): App_something::a_metho('a_variable...')
我已经搜索了很长时间但仍未找到解决方案。
我试过了:
修改/etc/my.cnf中的max_allowed_packed(在发生崩溃的sql上)将其设置为16M到64M(即使查询返回的结果真的不是那么大)。
修改max_connections以允许更多内容,以防我忘记删除一些已存在的连接。
检查网络上的问题
许多其他小东西,例如从主机到远程sql服务器的连接。
真正奇怪的是,如果单独运行查询它运行正常,如果所有数据库都在同一台服务器上,它也可以正常工作。
我现在真的迷失了,并且不知道问题可能来自哪里,这就是为什么我要求帮助或只是提示。
这是在例外情况下崩溃的方法:
public static function my_method($my_mysql_WHERE_variable)
{
//======================================
// cached?
//======================================
if(isset(self::$_table1[$my_mysql_WHERE_variable])) {
return self::$_table1[$my_mysql_WHERE_variable];
}
$pdo = my_App::getConnection();
$query = "SELECT *
FROM
a_table
WHERE
a_column = :my_mysql_WHERE_variable";
$stmt = $pdo->prepare($query);
if($stmt === false) {
**---------------IT CRASHES HERE-----------**
throw new my_App_Exception("Error executing query.\nInfo:\n" . print_r($pdo->errorInfo(), true));
}
.
.
.
return $a_value;
}
答案 0 :(得分:1)
您可能遇到过数据库连接问题。您是否在其他地方意外关闭了与此数据库的数据库连接?您没有为正在尝试运行的查询引用正确的连接吗?
答案 1 :(得分:0)
我发现此错误的原因是因为存在tcp连接超时。即使查询实际上很短,我仍然无法解释自己为什么会超时,但我设法通过修改/etc/sysctl.conf并为keepalive设置更高的值来解决我的问题。当然,我知道真正的解决方案是阅读每个查询,并尝试优化这些查询:)