Как установить вторую базу данных в laravel при отключенном основном соединении

#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 для получения дополнительной информации.