Мне интересно, есть ли способ справиться с ошибкой mysql и настроить ci для переключения на вторичный сервер БД в случае, если основной сервер недоступен (невозможно подключиться)?
Ну, я не знаю, будет ли это работать, но вы действительно можете попробовать это:
1) создать 2 группы параметров базы данных (в приложении / config / database.php):
// regular one.. $db['default']['hostname'] = 'localhost'; $db['default']['username'] = 'root'; //... // second connection $db['second']['hostname'] = 'localhost'; $db['second']['username'] = 'root'; //...
2) Установите deubg off, чтобы не показывать ошибки db и фактически убить ваш скрипт (сделайте это для обоих):
$db['default']['db_debug'] = FALSE;
3) Во время загрузки библиотеки вы можете передать TRUE во второй параграф, чтобы на самом деле было возвращаемое значение; он возвращает сам объект базы данных:
$dbobject1 = $this->load->database('default',TRUE); $dbobject2 = $this->load->database('second',TRUE);
Теперь вы можете просто проверить ресурс «ID соединения», чтобы узнать, установлено ли соединение или нет:
if(FALSE === $dbobject1->conn_id) { echo 'No connection established!'; }
Теперь вы можете решить загрузить другую БД, если первая не загружается. Недостатком является то, что вы не знаете, почему соединение db не работает, хотя …
Что касается того, как реализовать это, вы можете попробовать расширить класс базы данных или, лучше, создать свою собственную библиотеку, которая на самом деле просто проверяет, существует ли соединение или нет, и загрузите это вместо библиотеки базы данных. Поскольку он возвращает объект базы данных (кроме случаев, когда все 2 соединения терпят неудачу), вы можете тогда работать над этим, как и в обычном классе базы данных:
class Check_db { private $CI = ''; public $DB1 = ''; public $DB2 = ''; function __construct() { $this->CI =&get_instance(); $this->DB1 = $this->CI->load->database('default',TRUE); if(FALSE !== $this->DB1->conn_id) { return $this->DB1; } else { $this->DB2 = $this->CI->load->database('second',TRUE); if(FALSE !== $this->DB2->conn_id) { return $this->DB2; } else { return FALSE; } } }