Есть ли в PHP встроенный механизм восстановления после сбоя с одного сервера базы данных на другой?
Вопрос
Я нашел это:
http://www.evolt.org/failover-database -связность-с-PHP-MySQL р>
и похожие примеры. Но есть ли лучший способ?
Я думаю в духе клиента автоматического переключения при отказе в собственном клиенте MS SQL.
Решение
Традиционно обрабатывать стратегии отработки отказа на системном уровне; таким образом, все приложения могут пользоваться надежной средой.
Я хотел бы сослаться на стратегию отработки отказа 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');
. PS: я немного упустил отсюда, его нельзя использовать дословно.
PPS: я бы лучше использовал существующую библиотеку абстракции базы данных (Zend_Db, MDB2, ect) и реализовал их интерфейс вместо создания собственного специального решения
Нет, он не имеет этой встроенной функции. Я думаю, что простой способ - использовать MySQL Proxy а>. Иначе, но логика ( if (не удается) {подключиться к другому}
) в вашем приложении, но это не так красиво и здорово с точки зрения производительности.
В php нет встроенного механизма восстановления после отказа - вероятно, по уважительной причине. Такая система отработки отказа должна быть реализована на уровне операционной системы или оборудования.
В любом случае ваш образец предоставляет дешевый и простой механизм восстановления после отказа.