2

尝试在已超时的连接上查询数据库时,我开始收到此错误。

Fatal error: Uncaught exception 'ErrorException' with message 'mysql_query(): MySQL server has gone away'

所以我做了一堆研究,论坛上 99% 的用户都说你可以使用mysql_ping命令来检查连接,所以我把这个放在了适当的位置:

if(!mysql_ping($this->sDBLink))
    Connect(true);

现在我得到了同样的错误,只是引用了mysql_ping函数而不是mysql_query函数:

Fatal error: Uncaught exception 'ErrorException' with message 'mysql_ping(): MySQL server has gone away'

如何可靠地检查连接是否仍然存在? mysql_ping 抛出异常。

4

2 回答 2

4

为什么连接超时?因为它的未使用时间超过了特定阈值。这种事情对于各种网络应用程序来说都是必要的,以使它们具有弹性。如果用户在连接到 MySQL 服务器时突然关闭客户端计算机怎么办?服务器需要能够在一段时间后断开客户端连接。

这种东西是网络编程中固有的。这是一个功能,而不是一个错误。

你能做些什么呢?

您可以切换到处理这些东西的更现代的 mysql 连接管理库。

特别是如果您的客户端软件不经常使用,您可以重新组织您的软件以连接到 MySQL、使用连接和断开连接。这样你就不需要持久连接。但是,如果您的客户端服务器被大量使用,这是不切实际的。建立连接有很多开销。

您可以更改超时值。看这里。如何更改mysql持久连接的超时

您可以定期使用该连接。mysql_ping 使用连接而不实际执行任何服务器工作。类似的查询也会如此SELECT 1。如果您每隔一分钟左右 ping 一次连接,那么两分钟的超时不会导致您的 MySQL 服务器断定您的客户端已离开并断开连接。

您可以通过尝试重新建立连接而不是仅仅用错误消息吹出您的程序来处理您正确获得的 ErrorException。使用这样的 PHP 代码:

try {
    some operation on the mysql connection.
}
catch (ErrorException $ex) {
    disconnect mysql
    connect mysql
}
于 2013-06-17T15:37:40.307 回答
1

所以我知道这很丑陋,让我感到恶心,但它会起作用,直到我们获得足够的收入来保证升级。

我所做的只是关闭连接,然后重新创建它,因为我知道连接几乎 95% 的时间都会超时。

if($this->sDBLink){
    mysql_close($this->sDBLink);
}

if($bPersistant){
    $this->sDBLink = mysql_pconnect($this->sHostname, $this->sUsername, $this->sPassword);
} else {
    $this->sDBLink = mysql_connect($this->sHostname, $this->sUsername, $this->sPassword);
}
于 2013-06-17T17:35:13.340 回答