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’ 字段是用于指定数据库服务器的地址的。你需要将其替换为你的实际数据库服务器的地址。
然后,可以像单服务器中一样,在控制器中根据省份动态地切换数据库。
需要注意的是,把数据库部署到不同的服务器上时,需要确保应用服务器可以访问这些数据库服务器。