我需要在 laravel 应用程序中动态连接许多数据库。
如何设置数据库连接池?
例如,有很多二级域名,像这样:
chicago.example.com
newyork.example.com
losangeles.example.com
...
Run Code Online (Sandbox Code Playgroud)
他们有独立的数据库:
chicago
newyork
losangeles
...
Run Code Online (Sandbox Code Playgroud)
我像这样动态连接这些数据库:
public function store(Request $request)
{
//post request from http://chicago.example.com/articles
$server_name_arr=explode('.',$_SERVER['SERVER_NAME']); //the result is ['chicago','example','com']
$db=array_slice($server_name_arr,-3,1)[0]; //the result is 'chicago'
Config::set('database.connections.mysql.database', $db);
DB::reconnect('mysql');
//...
}
Run Code Online (Sandbox Code Playgroud)
为了性能,我想设置数据库连接池,在laravel中如何设置?
如果您的代码有很多不同的实例并且难以管理配置(env 文件),您可以修改代码,添加一个条件来修改 env 文件并在需要时缓存配置。如果您只需要一个管理功能,那么如果您只有一个实例,它将无法工作,请查看下面的代码。
如果您有一个实例和一台数据库服务器,那么也许您可以使用表前缀来区分您的表,我的意思是根据您的子域使用不同的前缀复制所有表。
但是如果你确实需要数据库连接池, Github上有一些针对 Laravel 的解决方案,但我从未尝试过。
public function store(Request $request)
{
//post request from http://chicago.example.com/articles
$server_name_arr=explode('.',$_SERVER['SERVER_NAME']); //the result is ['chicago','example','com']
$db=array_slice($server_name_arr,-3,1)[0]; //the result is 'chicago'
$current_db = DB::connection()->getDatabaseName();
if($db != $current_db){
$path = base_path('.env');
file_put_contents($path, str_replace('DB_DATABASE=' . current_db,
'DB_DATABASE=' . $db, file_get_contents($path)));
Artisan::call('config:cache');
}
//...
}
Run Code Online (Sandbox Code Playgroud)