5

我找到了这个:

http://www.evolt.org/failover-database-connection-with-php-mysql

和类似的例子。但是有更好的方法吗?

我正在考虑MS SQL Native Client 中的自动故障转移客户端。

4

4 回答 4

8

在系统级别处理故障转移策略是传统的;这样所有应用程序都可以享受一个强大的环境。

我想参考MySQL 故障转移策略MySQL 代理。后者描述了一个 MySQL 实用程序,它可以进行负载平衡和故障转移,并且似乎很容易设置。

不是问题的答案,但它是处理故障转移的更常见的解决方案。

于 2008-10-10T14:29:39.647 回答
3

在 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');

PS:我已经离开了很多,它不是逐字使用的。

PPS:我可能会更好地使用现有的数据库抽象库(Zend_Db、MDB2 等)并实现它们的接口,而不是创建自己的临时解决方案

于 2008-10-10T15:21:13.537 回答
2

不,它没有内置。我认为一个简单的方法是使用MySQL Proxy。否则,您的应用程序中的逻辑( if (fails) { connect to another }) 就性能而言不是那么漂亮和出色。

于 2008-10-10T14:28:37.013 回答
2

php 没有内置的故障转移机制 - 可能是有充分理由的。这种故障转移系统应该在操作系统或硬件层面实现。

无论如何,您的示例提供了一种廉价且简单的故障转移机制。

于 2008-10-10T14:31:53.747 回答