php+thinkphp6实现数据库分库(单服务器或多服务器)
一、问题简介
开发过程中遇到数据分库问题,以地域为划分(本省和外省),以下是两种解决方案。
二、单服务器多数据库
-
配置数据库连接:在应用目录下的config目录中,有一个database.php配置文件。在这个文件中,可以配置数据库连接信息。假设有两个数据库(db1表示本省,db2表示外省),那么配置可能如下:
phpCopy codereturn [ // 默认使用的数据库连接配置 'default' => env('database.driver', 'mysql'), // 自定义数据库连接 'connections' => [ 'db1' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => 'localhost', // 数据库名 'database' => 'db1', // 用户名 'username' => 'root', // 密码 'password' => 'password', // 端口 'hostport' => '3306', ], 'db2' => [ 'type' => 'mysql', 'hostname' => 'localhost', 'database' => 'db2', 'username' => 'root', 'password' => 'password', 'hostport' => '3306', ], ], // ...];
-
动态切换数据库:在控制器中根据具体的业务逻辑来动态切换数据库。
phpCopy codenamespace app\index\controller;use think\facade\Db;class Index{ public function index() { $province = $this->getProvince(); // 你的逻辑来决定省份 if ($province == '本省') { $data = Db::connect('db1')->table('your_table')->select(); } else { $data = Db::connect('db2')->table('your_table')->select(); } // 业务逻辑... }}
我们首先获取省份,然后根据省份来连接不同的数据库。假设
getProvince()
方法会根据某种逻辑(比如用户IP,用户选择,等等)返回省份。
在项目中,可能需要考虑更多的因素,例如数据库连接的错误处理,更复杂的分库逻辑,以及数据库性能优化等。
二、多服务器多数据库
如果想将两个数据库放在不同的服务器上,需要在ThinkPHP的数据库配置文件中(database.php),分别为这两个数据库设置不同的主机名(hostname)。
如果有两个数据库服务器,可以这样设置数据库连接配置:
phpCopy codereturn [ // 默认使用的数据库连接配置 'default' => env('database.driver', 'mysql'), // 自定义数据库连接 'connections' => [ 'db1' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => 'server1', // 服务器1的地址 // 数据库名 'database' => 'db1', // 用户名 'username' => 'root', // 密码 'password' => 'password', // 端口 'hostport' => '3306', ], 'db2' => [ 'type' => 'mysql', 'hostname' => 'server2', // 服务器2的地址 'database' => 'db2', 'username' => 'root', 'password' => 'password', 'hostport' => '3306', ], ], // ...];
在这个配置中,‘hostname’ 字段是用于指定数据库服务器的地址的。你需要将其替换为你的实际数据库服务器的地址。
然后,可以像单服务器中一样,在控制器中根据省份动态地切换数据库。
需要注意的是,把数据库部署到不同的服务器上时,需要确保应用服务器可以访问这些数据库服务器。
来源地址:https://blog.csdn.net/gudada010/article/details/130987700