php 8.5 本身不内置读写分离中间件,需在框架层实现;thinkphp 8.x 通过 .env 控制 deploy/rw_separate 并配置 read/write 数组启用,laravel 则原生支持 read/write 子数组路由,两者均需手动处理灰度分流与强一致性读兜底。

PHP 8.5 本身不内置数据库读写分离中间件,它只是一个语言运行环境。所谓“配置读写分离中间件”,实际是指在你选用的PHP框架或数据库访问层中启用并配置该能力。目前主流方案集中在 ThinkPHP 8.x、Laravel(含 Laravel Octane)、或基于 PDO/MySQLi 自研中间件。下面以最常用且明确支持读写分离的 ThinkPHP 8.0+ 为例,说明如何在 PHP 8.5 环境下落地:
配置核心:Env 控制 + 连接级动态路由
ThinkPHP 8.0 起将读写分离逻辑下沉到 database.php 的连接定义内部,必须通过 .env 控制开关,并在 connections['mysql'] 中显式注入变量,否则不生效。
-
在
.env中声明开关与地址:DB_DEPLOY=1 DB_RW_SEPARATE=true DB_HOST_MASTER=192.168.1.10 DB_HOST_SLAVE_1=192.168.1.11 DB_HOST_SLAVE_2=192.168.1.12
-
在
config/database.php的mysql连接配置中写入:'mysql' => [ 'type' => 'mysql', 'hostname' => Env::get('DB_HOST_MASTER', '127.0.0.1'), 'database' => Env::get('DB_DATABASE', 'thinkphp'), 'username' => Env::get('DB_USERNAME', 'root'), 'password' => Env::get('DB_PASSWORD', ''), 'hostport' => Env::get('DB_PORT', 3306), // ✅ 关键:deploy 和 rw_separate 必须在此层级设置 'deploy' => (int)Env::get('DB_DEPLOY', 0), 'rw_separate' => filter_var(Env::get('DB_RW_SEPARATE', 'false'), FILTER_VALIDATE_BOOLEAN), 'read' => [ Env::get('DB_HOST_SLAVE_1'), Env::get('DB_HOST_SLAVE_2'), ], 'write' => [Env::get('DB_HOST_MASTER')], // 其他参数如 charset、debug 等保持不变 ]
⚠️ 注意:
'read'必须是非空二维数组(即使只配一个从库也要写成['192.168.1.11']),DB_DEPLOY=0时可设'read' => [],但开启后为空会报错。
灰度路由:按请求特征分流(如用户ID、Header)
TP8 不自动支持“部分请求走从库”,需手动注册事件钩子:
-
在服务启动时(如
app/common.php或App/Service/DbRouter.php)绑定:use think\db\Connection; use think\Db; Db::event('before_select', function (Connection $connection) { // 示例:仅 UID 为偶数的用户走从库 $uid = session('user_id') ?: request()->header('X-User-ID', 0); if ($uid && $uid % 2 === 0) { $connection->useReadConnection(true); } }); 支持更细粒度判断:结合 Token 解析、AB 测试标识、IP 段、URL 路径等。
补充:Laravel 用户怎么办?
Laravel 原生支持读写分离(无需额外中间件),只需在 config/database.php 的 mysql 配置中定义 read / write 子数组:
'mysql' => [
'read' => [
'host' => [env('DB_HOST_SLAVE_1'), env('DB_HOST_SLAVE_2')],
],
'write' => [
'host' => [env('DB_HOST_MASTER')],
],
// 其他参数...
],
它会自动在 SELECT 时轮询 read.host,其他操作走 write.host。灰度控制需靠自定义 Connection 类或中间件拦截 Builder 实例。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











