如何在Laravel中动态重置数据库配置?

时间:2018-03-17 00:45:06

标签: php mysql laravel laravel-5

我正在尝试获取托管在多个服务器上的数据库的大小。例如,Server A上有2个数据库,Server B上有3个数据库。

我想从Laravel应用程序中获取所有这些数据库的大小。实际上,我知道如何reset配置。这是我正在使用的代码,但它只给了我第一个数据库的正确数据库大小。其他人的NULL大小不正确,因为我知道Server B上的某个数据库的大小为0.6MB,因为我已在其上安装了WordPress。< / p>

$databases = array();
foreach($servers as $server){
    // Setting Config
    Config::set('database.connections.mysqlClient.host',$server->ip);
    Config::set('database.connections.mysqlClient.password',$server->mysql_password);

    foreach($server->databases as $database){
        $database->size = DB::connection('mysqlClient')->select('SELECT Round(Sum(data_length + index_length) / 1024 / 1024, 1) "db_size"
            FROM   information_schema.tables 
            where table_schema = "'.$database->name.'";'
        )[0]->db_size;

        $databases[] = $database;
    }
}

由于我在循环中配置了凭据,因此应为每个服务器更新mysqlClient的凭据或配置。如果它更新了配置,我应该为所有数据库获得正确的大小,而不是这种情况。

脚本没有抛出任何异常。我确信Config有问题。这是因为当我尝试获取特定服务器上所有数据库的大小时,我得到了完美的结果。

1 个答案:

答案 0 :(得分:2)

未经测试,因为我目前没有设置此类设置,但我确定您需要在配置交换后清除DB

$databases = array();
foreach($servers as $server){
    // Setting Config
    Config::set('database.connections.mysqlClient.host',$server->ip);
    Config::set('database.connections.mysqlClient.password',$server->mysql_password);

    foreach($server->databases as $database){
        DB::purge('mysqlClient'); // <-- Get rid of old connection
        $database->size = DB::connection('mysqlClient')->select('SELECT Round(Sum(data_length + index_length) / 1024 / 1024, 1) "db_size"
            FROM   information_schema.tables 
            where table_schema = "'.$database->name.'";'
        )[0]->db_size;

        $databases[] = $database;
    }
}

编辑:还有\DB::reconnect('mysqlClient');,但人们已经记录了它的问题