我有一个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服务器,它仍会抛出数据库名称
答案 0 :(得分:0)
您可以在app / config / database.php中定义两个mysql连接 使用中间件,您可以定义应该连接的数据库。
您可以在此网址中找到更详细的说明:
http://fideloper.com/laravel-multiple-database-connections
答案 1 :(得分:0)
我最近开始搜索相同的内容,并尽快更改连接
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 docs以获得更多信息。
答案 2 :(得分:0)
为此,我正在考虑使用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连接解析背后的基础方法是Illuminate\Database\Connectors::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将随机选择连接的主机之一并尝试连接到它们。如果尝试失败,它将继续尝试直到找不到更多主机为止。