【问题标题】:MySQL server has gone away - ErrorExceptionMySQL 服务器已消失 - ErrorException
【发布时间】:2013-06-13 14:29:08
【问题描述】:

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

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 会引发异常。

【问题讨论】:

  • 'MySQL server has gone away' 是一个有趣的异常消息 - 也许是微软的叛逃者?
  • 据我了解,这意味着连接已超时。我在程序的早期创建了我的连接。当我稍后尝试使用相同的连接时,会出现此错误。
  • 您没有使用 PDO 或 mysqli 对象是否有原因?他们已经弃用了这个扩展,我从来没有使用其他两个中的任何一个看到过这个错误。
  • 您需要在连接上捕获错误,只有在建立与服务器的连接时 ping 才有效。如果您在连接上捕获错误,则可以中止应用程序加载并标记一个不错的连接错误。
  • 您的全局设置 mysql.reconnect 是否启用?检查php.net/manual/en/mysqli.configuration.php#ini.mysqli.reconnect

标签: php mysql exception


【解决方案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);
}

【讨论】:

    【解决方案2】:

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

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

    对此你能做些什么?

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

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

    您可以更改超时值。看这里。 how to change timeout for mysql persistent connections

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

    您可以通过尝试重新建立连接来正确处理您遇到的 ErrorException,而不是仅仅用错误消息来破坏您的程序。使用类似这样的 PHP 代码:

    try {
        some operation on the mysql connection.
    }
    catch (ErrorException $ex) {
        disconnect mysql
        connect mysql
    }
    

    【讨论】:

    • 我完全同意。这个项目是我继承的。我正在对复杂的解决方案进行一些小改动。在我了解更多关于它如何影响已经使用此类的代码之前,我对更改库感到不舒服。
    • 这个答案包含一个重要的细节:在 mySQL 服务器“消失”之后,PHP 仍然认为这是您的数据库连接,即使它已断开,因此将返回相同的旧断开链接除非您先关闭连接,否则重新连接。 (或者明确地请求一个新的,随着时间的推移可能会泄漏内存,因为旧的不会被清理。)谢谢你的提示! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2011-06-07
    • 2010-12-20
    • 2015-01-15
    • 2016-03-06
    • 2017-04-02
    相关资源
    最近更新 更多