我收到以下错误:
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连接才能在守护进程的整个持续时间内保持稳定 - 这可能是永远的。
答案 0 :(得分:1)
你有几个选择。
但作为前驱,你应该尝试远离依赖mysql_ *并开始使用PDO。
总之... 当您打开mysql连接时,它将保持“可用”,直到等待超时到期。你正在做的是不断创建一个新的连接(也没有关闭其他连接)。这意味着你要么达到服务器mysql限制,要么你的unix盒子限制非常快。
您应首先检查服务器以查看此超时设置的内容。
如果它非常低,您可能需要考虑在my.cnf中增加它。默认时间段为28800
秒(如果我没记错的话)。
您可以通过发出以下查询进行检查:
SHOW variables like "%wait_timeout%"
然后您可以更改my.cnf中的值以增加它,或者您也可以使用
进行设置SET @@GLOBAL.wait_timeout=288000
好的,现在,通过合理的设置超时设置,您可以确保没有收到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
替换为您实际想要使用的查询。这只是一个例子。