#php #sql #sql-server #laravel
#php #sql #sql-сервер #laravel
Вопрос:
У меня есть проект laravel с множеством подключений к разным IP-адресам.
Я хочу, чтобы laravel подключался к резервной базе данных в случае, если основной SQL-сервер не работал
Пример.
192.168.1.2 -> SQL DB #1
192.168.1.3 -> SQL DB #1 Backup
Если 192.168.1.2 отключается, laravel должен подключиться к 192.168.1.3
Я бы хотел сделать это в database.php файл, но я думаю, что это невозможно.
Я пытался протестировать соединение, прежде чем делать такой запрос:
if(DB::connection('connection')->getDatabaseName())
но кажется, что он сохраняет данные в кэше и все равно выдает имя базы данных, даже если я выключаю SQL server
Ответ №1:
Для этого ответа я рассматриваю Laravel 5.
Отлаживая модельный запрос, я обнаружил, что соединения Laravel поддерживают не один хост, а их список.
[
'driver' => 'sqlsrv',
'host' => [
'192.168.1.2',
'192.168.1.3',
],
'database' => 'database_name',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'transaction_isolation' => PDO::SQLSRV_TXN_READ_UNCOMMITTED, // Not required, but worth mentioning it's possible to define it here too
'options' => [],
]
Основной метод, лежащий в основе разрешения соединений Laravel IlluminateDatabaseConnectors::createPdoResolverWithHosts
, имеет следующее поведение:
protected function createPdoResolverWithHosts(array $config)
{
return function () use ($config) {
foreach (Arr::shuffle($hosts = $this->parseHosts($config)) as $key => $host) {
$config['host'] = $host;
try {
return $this->createConnector($config)->connect($config);
} catch (PDOException $e) {
continue;
}
}
throw $e;
};
}
Такое поведение означает, что Laravel случайным образом выберет один из хостов соединения и попытается подключиться к ним. Если попытка завершается неудачей, она продолжает попытки, пока не будет найдено больше хостов.
Ответ №2:
Вы могли бы определить два соединения mysql в app/config/database.php и с помощью промежуточного программного обеспечения вы могли бы определить базу данных, к которой следует подключиться.
Вы можете найти более подробное объяснение в этом URL:
http://fideloper.com/laravel-multiple-database-connections
Ответ №3:
недавно я начал искать то же самое, и чтобы изменить соединение как можно скорее, вы можете либо
- добавьте проверку внутри поставщика услуг
- или через глобальное промежуточное программное обеспечение
try{
DB::connection()->getPdo(); // check if we have a connection
}catch{
DB::purge(config('database.default')); // disconnect from the current
DB::setDefaultConnection('my-fallback-db'); // connect to a new one
}
также проверьте документы laravel api для получения дополнительной информации.