webman不支持自动读写分离,需手动配置mysql_master和mysql_slave两个独立连接,并显式调用db::connection('mysql_slave')执行读操作;所有查询构建器方法(如table()->get())默认走default连接,事务内严禁混用连接,主从延迟问题须按业务一致性需求合理路由。

Webman 本身不支持自动读写分离,必须手动配置多个数据库连接,并在代码中显式指定使用哪个连接——否则所有操作(包括 Db::select())都走 default 配置的主库。
配置两个独立 MySQL 连接:mysql_master 和 mysql_slave
Webman 的数据库配置必须严格遵循 illuminate/database 的格式,config/database.php 中不能只写一个连接,而要包裹在 connections 数组里:
-
'default' => 'mysql_master':仅用于兜底,不影响读写路由逻辑 -
mysql_master和mysql_slave必须是两个完全独立的连接配置,host、port、database均不同(哪怕只是端口不同) - 每个连接都必须显式声明
'driver' => 'mysql',漏掉会报Driver not supported - 不要在
mysql_slave配置里写'read' => []或'write' => []—— Webman 的support/database不识别这个结构,纯属无效字段
读操作必须显式调用 Db::connection('mysql_slave')
Webman 不解析 SQL 类型,也不会根据 SELECT 自动切从库。你写 Db::select('users'),它就一定走 default(即 mysql_master);想走从库,就得手动绑定:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 正确:
Db::connection('mysql_slave')->select("SELECT * FROM posts WHERE status = ?", [$status]) - 错误:
Db::connection('mysql_slave')->table('posts')->where('status', $status)->get()——table()是查询构建器入口,和select()不共享连接上下文,这里实际走的仍是default - 事务内严禁混用连接:
Db::connection('mysql_master')->beginTransaction()后,所有insert/update/delete必须继续用同一个实例,跨连接调用commit()会静默失败或产生孤立事务
避免“刚写完就读不到”的主从延迟问题
用户发帖后立刻查列表却看不到新内容,不是代码 bug,而是 MySQL 主从复制固有延迟导致的。此时不能盲目切回主库查,否则读写分离失效:
- 对强一致性读(如个人中心最新发帖、订单详情),直接走
mysql_master,但需加注释说明原因 - 对非关键列表页(如全站热门帖),接受几秒延迟,坚持走
mysql_slave - 不要在同一个请求里对同一张表既走
mysql_master又走mysql_slave(比如先查用户信息再查其发帖列表),主从延迟会导致数据逻辑断裂
真正容易被忽略的是连接复用边界:Webman 请求生命周期内,Db::connection('mysql_slave') 每次调用都返回新实例,不会自动复用连接池。高频读场景下,建议封装成单例服务或用 static 缓存连接实例,否则可能触发 MySQL 的 max_connections 限制。










