我有一个用PHP编写的Web应用程序的Master-Slave设置。我有一个用于读取的从属池,以及一个用于写入的主服务器(如果已经发送了此请求,则会读取)。我想为读取池中的已删除崩溃服务器合并一个自动化系统。目前我正在使用:
foreach($readers as $reader)
{
$fp = @fsockopen($reader['host'],3306,$errno,$errstr,1);
if(!$fp)
{
//Remove from pool
}
unset($fp);
}
我的主要问题是有一种更可靠的方法。我有很多误报,反之亦然,因为它实际上并没有检查MySQL服务器,而只是端口3306上的连接。有没有办法检查MySQL服务器而不引发异常,这是PHP中PDO和MySQLi扩展的行为。
答案 0 :(得分:7)
您可以使用mysql_connect()
并检查false
的结果,并在成功时立即关闭连接。如果您愿意,可以创建一个没有特权的虚拟帐户。
这是唯一可靠的方法,特别是如果你想区分正在运行的MySQL服务器与侦听端口3306的任何其他随机进程。
答案 1 :(得分:0)
您可以使用mysql_ping()检查您打开的当前数据库连接是否仍然存在
以下是http://www.php.net/manual/en/function.mysql-ping.php
发布的示例<?php
set_time_limit(0);
$conn = mysql_connect('localhost', 'mysqluser', 'mypass');
$db = mysql_select_db('mydb');
/* Assuming this query will take a long time */
$result = mysql_query($sql);
if (!$result) {
echo 'Query #1 failed, exiting.';
exit;
}
/* Make sure the connection is still alive, if not, try to reconnect */
if (!mysql_ping($conn)) {
echo 'Lost connection, exiting after query #1';
exit;
}
mysql_free_result($result);
/* So the connection is still alive, let's run another query */
$result2 = mysql_query($sql2);
?>
答案 2 :(得分:0)
检查任何服务是否存活的最佳方法是实际使用它。所以对于MySQL尝试连接并执行一些快速查询,为Web服务器尝试获取一些文件,为PHP尝试获取一些简单的脚本...
对于MySQL主/从设置,其中一个解决方案是实际检查复制状态。您可以检查主服务器后面的从服务器的数量,并决定在存在旧数据时/停止使用该服务器。 (我自己不做复制,但我认为你需要比较变量Read_Master_Log_Pos
和Relay_Log_Pos
)