本文目录导读:

在ThinkPHP框架中配置主从读写分离,可以按照以下步骤进行:
基础配置(config/database.php)
<?php
return [
// 默认使用主库
'default' => 'mysql',
// 数据库连接配置
'connections' => [
'mysql' => [
// 主库配置
'type' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'main_db',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
'prefix' => '',
// 从库配置(关键配置)
'slave' => [
// 从库连接
[
'type' => 'mysql',
'host' => '192.168.1.100', // 从库1地址
'port' => '3306',
'database' => 'slave_db',
'username' => 'slave_user',
'password' => 'slave_password',
'charset' => 'utf8mb4',
],
// 可以配置多个从库
[
'type' => 'mysql',
'host' => '192.168.1.101', // 从库2地址
'port' => '3306',
'database' => 'slave_db',
'username' => 'slave_user',
'password' => 'slave_password',
'charset' => 'utf8mb4',
],
],
],
],
// 开启读写分离
'rw_separate' => true,
// 从库负载均衡策略(可选:random, round-robin)
'slave_load_balance' => 'random',
// 查询是否走从库
'read_master' => false,
];
使用use配置文件方式
// config/database.php
return [
'connections' => [
'mysql' => [
'type' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'main_db',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
'prefix' => '',
// 从库配置
'slave' => [
'host' => '192.168.1.100',
'port' => '3306',
'database' => 'slave_db',
'username' => 'slave_user',
'password' => 'slave_password',
'charset' => 'utf8mb4',
'prefix' => '',
// 可以使用逗号分隔多个从库
// 'host' => '192.168.1.100,192.168.1.101',
],
],
],
];
高级配置(读写分离策略)
return [
// 数据库连接配置
'connections' => [
'mysql' => [
// 主库配置
'type' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'main_db',
'username' => 'root',
'password' => 'password',
// 从库配置
'slave' => [
// 从库1
[
'type' => 'mysql',
'host' => '192.168.1.100',
'port' => '3306',
'database' => 'slave_db1',
'username' => 'slave_user',
'password' => 'password',
'weight' => 2, // 权重配置(用于负载均衡)
],
// 从库2
[
'type' => 'mysql',
'host' => '192.168.1.101',
'port' => '3306',
'database' => 'slave_db2',
'username' => 'slave_user',
'password' => 'password',
'weight' => 1,
],
],
// 读写分离配置
'params' => [
// 强制主库操作(写入操作)
'force_master' => true,
],
],
],
// 全局读写分离配置
'global_rw_separate' => true,
// 异常处理
'exception_handle' => true,
// 主从同步延迟检查
'check_slave_delay' => true,
'max_slave_delay' => 5, // 最大延迟秒数
];
在模型中使用
<?php
namespace app\model;
use think\Model;
class User extends Model
{
// 指定主库操作(写入)
protected $connection = 'mysql';
// 指定从库操作(读取)
protected $readConnection = 'mysql';
// 手动指定使用从库
public function getUsersFromSlave()
{
$slave = $this->db();
$slave->setConnection('mysql#slave');
return $slave->select();
}
// 强制使用主库
public function forceMaster()
{
return $this->db()->query('SELECT * FROM users', [], true);
}
}
使用Db类操作
use think\facade\Db;
// 默认自动选择:读操作走从库,写操作走主库
$users = Db::name('users')->select(); // 读操作(优先从库)
// 强制使用主库
$user = Db::name('users')->forceMaster()->find(1);
// 手动指定用主库
Db::name('users')->useMaster()->find(1);
// 手动指定用从库
Db::name('users')->useSlave()->select();
// 事务操作(自动使用主库)
Db::transaction(function () {
Db::name('users')->insert(['name' => 'test']);
Db::name('logs')->insert(['action' => 'insert']);
});
封装的DbHelper类示例
<?php
namespace app\helper;
use think\facade\Db;
class DbHelper
{
/**
* 强制从主库读取
* @param string $table
* @param array $where
* @return mixed
*/
public static function master($table, $where = [])
{
return Db::name($table)->useMaster()->where($where)->select();
}
/**
* 强制从从库读取
* @param string $table
* @param array $where
* @return mixed
*/
public static function slave($table, $where = [])
{
return Db::name($table)->useSlave()->where($where)->select();
}
/**
* 自动选择(推荐)
* @param string $table
* @param array $where
* @return mixed
*/
public static function auto($table, $where = [])
{
return Db::name($table)->where($where)->select();
}
}
注意事项
需要修改时强制使用主库
// 数据修改后需要立即读取,强制使用主库
Db::name('orders')->insert($data);
$order = Db::name('orders')->useMaster()->find($orderId);
开启debug日志
// config/app.php 'debug' => true, // config/log.php 'levels' => ['error', 'info', 'sql'],
监控连接状态
// 查看当前使用的连接 $connection = Db::getConfig();
完整配置示例
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'type' => 'mysql',
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'main_db',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
'prefix' => '',
// 从库配置
'slave' => [
'host' => '192.168.1.100,192.168.1.101',
'port' => '3306',
'database' => 'slave_db',
'username' => 'slave_user',
'password' => 'password',
'charset' => 'utf8mb4',
'prefix' => '',
],
// 连接池配置
'pool' => [
'max_connections' => 10,
'min_connections' => 2,
'max_idle_time' => 60,
'max_wait_time' => 10,
],
'params' => [
PDO::ATTR_TIMEOUT => 5,
PDO::ATTR_PERSISTENT => false,
PDO::ATTR_EMULATE_PREPARES => false,
],
'break_match' => [
'error' => ['HY000'],
],
],
],
// 自动读取从库
'rw_separate' => true,
// 从库负载均衡
'slave_load_balance' => 'round-robin',
];
这套配置可以实现ThinkPHP的读写分离,有效分散数据库压力,提升系统性能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播