Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL服务器已消失-错误异常_Php_Mysql_Exception - Fatal编程技术网

Php MySQL服务器已消失-错误异常

Php MySQL服务器已消失-错误异常,php,mysql,exception,Php,Mysql,Exception,我在试图查询超时连接上的数据库时开始出现此错误 Fatal error: Uncaught exception 'ErrorException' with message 'mysql_query(): MySQL server has gone away' 所以我做了一系列的研究,99%的论坛用户说你可以使用mysql\u-ping命令来检查连接,所以我把这个放在适当的位置: if(!mysql_ping($this->sDBLink)) Connect(true); 现在我

我在试图查询超时连接上的数据库时开始出现此错误

Fatal error: Uncaught exception 'ErrorException' with message 'mysql_query(): MySQL server has gone away'
所以我做了一系列的研究,99%的论坛用户说你可以使用mysql\u-ping命令来检查连接,所以我把这个放在适当的位置:

if(!mysql_ping($this->sDBLink))
    Connect(true);
现在我得到了相同的错误,只是参考了mysql\u-ping函数,而不是mysql\u-query函数:

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

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

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

这种事情是网络编程固有的。这是一个功能,不是一个bug

对此你能做些什么

您可以切换到更现代的mysql连接管理库来处理这些内容

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

您可以更改超时值。看这里

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

您可以通过尝试重新建立连接,而不是仅仅用错误消息中断程序,来正确处理所得到的ErrorException。使用类似以下内容的PHP代码:

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

所以我知道这很难看,让我感到恶心,但在我们有足够的收入来保证升级之前,它是有效的

我所做的只是关闭连接,然后重新创建它,因为我知道连接将有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);
}

“MySQL服务器消失了”是一条有趣的例外消息——也许是微软的叛逃者?据我所知,这意味着连接超时了。我在程序的早期创建了连接。当我稍后尝试使用相同的连接时,会出现此错误。是否有原因不使用PDO或mysqli对象?他们不推荐使用此扩展,我从未见过使用其他两个扩展中的任何一个出现此错误。您需要捕获连接上的错误,ping仅在与服务器建立连接时有效。如果您捕获了连接上的错误,那么您可以中止应用程序加载并标记一个良好的连接错误。您的全局设置mysql.reconnect启用了吗?我完全同意。这个项目是我继承的。我正在对一个复杂的解决方案做一些小改动。在我进一步了解该库如何影响已经使用该类的代码之前,我不愿意更改该库。这个答案包含一个重要的细节:在mySQL服务器“消失”之后,PHP仍然认为这是您的数据库连接,即使它断开了,因此,在重新连接时将返回相同的旧断开链接,除非先关闭连接。(或者显式请求一个新的,这可能会随着时间的推移而泄漏内存,因为旧的不会被清除。)感谢您的提示!:-)