【发布时间】:2011-02-28 21:55:08
【问题描述】:
基本上在伪代码中我正在寻找类似的东西
if (connected_to_any_database()) {
// do nothing
}
else {
mysql_connect(...)
}
如何实现
connected_to_any_database()
【问题讨论】:
基本上在伪代码中我正在寻找类似的东西
if (connected_to_any_database()) {
// do nothing
}
else {
mysql_connect(...)
}
如何实现
connected_to_any_database()
【问题讨论】:
你试过mysql_ping()吗?
更新:从 PHP 5.5 开始,请改用 mysqli_ping()。
Ping 一个服务器连接,或在连接中断时尝试重新连接。
if ($mysqli->ping()) { printf ("Our connection is ok!\n"); } else { printf ("Error: %s\n", $mysqli->error); }
或者,第二种(不太可靠的)方法是:
$link = mysql_connect('localhost','username','password');
//(...)
if($link == false){
//try to reconnect
}
【讨论】:
mysqli_ping()
--verbose 选项的php-CLI 运行脚本。
Baron Schwartz 在博客中指出,由于竞争条件,这种“写前检查”是一种不好的做法。他提倡使用 reconnect 在 catch 中的 try/catch 模式。这是他推荐的伪代码:
function query_database(connection, sql, retries=1)
while true
try
result=connection.execute(sql)
return result
catch InactiveConnectionException e
if retries > 0 then
retries = retries - 1
connection.reconnect()
else
throw e
end
end
end
end
这是他的完整博客:https://www.percona.com/blog/2010/05/05/checking-for-a-live-database-connection-considered-harmful/
【讨论】:
尝试使用 PHP 的 mysql_ping 函数:
echo @mysql_ping() ? 'true' : 'false';
您需要在前面加上“@”来假设您在未连接到数据库的情况下运行此函数会收到 MySQL 警告。
还有其他方法,但这取决于您使用的代码。
【讨论】:
mysql_ping 会尝试用空数据建立连接?我认为没有办法避免@,除了为该行打开错误报告,这实际上是同一件事
set_error_handler()?
mysql_ping。分析回溯?如果您想在其他地方调用 mysql_ping 但对错误采取不同的操作(例如显示它)怎么办?
【讨论】:
之前...(我的意思是在您不确定是否包含在其他文件中的某个位置)
$db = mysql_connect()
稍后...
if (is_resource($db)) {
// connected
} else {
$db = mysql_connect();
}
【讨论】:
// Earlier in your code
mysql_connect();
set_a_flag_that_db_is_connected();
// Later....
if (flag_is_set())
mysql_connect(....);
【讨论】: