Laravel:如何设置数据库连接池?

zwl*_*619 10 php laravel

我需要在 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中如何设置?

gpa*_*tis 0

如果您的代码有很多不同的实例并且难以管理配置(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)