我发现了这个:
http://www.evolt.org/failover-database-connection-with-php-mysql
以及类似的实例。但是有更好的方法吗?
我是按照MS SQL Native Client中的自动故障转移客户端的思路思考的。
传统的做法是在系统级别处理故障切换策略;这样,所有应用程序都可以享受强健的环境。
我想参考MySQL故障切换策略和MySQL代理。后者描述了一个MySQL实用程序,它可以进行负载平衡和故障切换,并且似乎很容易设置。
这不是问题的答案,但它是处理故障切换的更常见的解决方案。
PHP中没有内置任何内容来处理这一问题。你必须自己写代码。
最好的方法是抽象数据库访问,并创建一个可以封装故障转移逻辑的类。
这是一些即兴的代码:
interface MySQL_Interface {
public function query($sql);
}
class MySQL_Concrete implements MySQL_Interface {
public function __construct($host, $user, $pass, $dbname) {
$this->_mysql = mysql_connect($host, $user, $pass) or throw Exception("Could not connect to server");
mysql_select_db($db, $this->_mysql) or throw Exception("Could not connect to database");
}
public function query($sql) {
return mysql_query($sql) or throw new Exception("Query failed");
}
}
class MySQL_Failover implements MySQL_Interface {
public function __construct(MySQL_Interface $one, MySQL_Interface $two) {
$this->_one = $one;
$this->_two = $two;
}
public function query($sql) {
try {
return $this->_one->query($sql);
} catch (Exception $e) {
return $this->_two->query($sql);
}
}
}
$db = new MySQL_Failover(
new MySQL_Concrete('host1', 'user', 'pass', 'db'),
new MySQL_Concrete('host2', 'user', 'pass', 'db')
);
$db->query('SELECT * FROM Users');
附言:我在这里留下了很多,不能逐字逐句地使用
PPS:我可能最好使用现有的数据库抽象库(Zend_Db、MDB2等)并实现它们的接口,而不是创建自己的特别解决方案
不,它没有内置。我认为一个简单的方法是使用MySQL Proxy。否则,请考虑应用程序中的逻辑(if (fails) { connect to another }
),但就性能而言,这不是很好。
php没有内置的故障切换机制——这可能是有充分理由的。这种故障切换系统应该在操作系统或硬件级别中实现。
无论如何,您的示例提供了一种廉价而简单的故障切换机制。