mysql链接服务器丢失,无法重新连接

时间:2011-12-13 15:12:51

标签: php mysql

我收到以下错误:

Link to server lost, unable to reconnect

我有一个mysql守护进程编码,我使用mysql_pconnect连接到mysql但过了一会儿,我收到以下错误,守护进程停止正常运行:

Link to server lost, unable to reconnect

我所做的是以下内容:

while(true)
{
  $connect = mysql_pconnect(...);
  $db = mysql_select_db(...);
}

我该怎么做才能防止这种情况发生?我需要mysql连接才能在守护进程的整个持续时间内保持稳定 - 这可能是永远的。

1 个答案:

答案 0 :(得分:1)

你有几个选择。

但作为前驱,你应该尝试远离依赖mysql_ *并开始使用PDO。

总之... 当您打开mysql连接时,它将保持“可用”,直到等待超时到期。你正在做的是不断创建一个新的连接(也没有关闭其他连接)。这意味着你要么达到服务器mysql限制,要么你的unix盒子限制非常快

等待超时

您应首先检查服务器以查看此超时设置的内容。 如果它非常低,您可能需要考虑在my.cnf中增加它。默认时间段为28800秒(如果我没记错的话)。

您可以通过发出以下查询进行检查:

SHOW variables like "%wait_timeout%"

然后您可以更改my.cnf中的值以增加它,或者您也可以使用

进行设置
SET @@GLOBAL.wait_timeout=288000

SELECT 1

好的,现在,通过合理的设置超时设置,您可以确保没有收到mysql has gone away消息的“典型”方式就是执行SELECT 1。这将执行另一个查询并确保连接保持打开状态。

并且,使用PDO的好处是,您可以捕获可能在SELECT 1失败时抛出的PDOExceptions。

这意味着,如果抛出异常,您可以再次尝试连接,然后再次检查。如果你之后无法连接那么你应该杀死你的守护进程。 这是一些代码....您显然必须使用有效的连接字符串来创建PDO对象。

    // $pdo holds the connection and a PDO object.  
    try {
            $pdo->execute("SELECT 1");
        } catch (PDOException $e) {
            // Mysql has gone away. 
            $pdo = null
            $pdo = new PDO( $connectionString );
            echo "Mysql has gone away - But we attempted to reconnect\n";
            try {
                 $pdo->execute("SELECT 1");
            } catch (PDOException $e) {
                 echo "Mysql has failed twice - Kill Daemon\n";
                 throw($e);
            }
      }

这是我可能会采取的解决方案。

您可以轻松地将SELECT 1替换为您实际想要使用的查询。这只是一个例子。