ThinkPHP数据库超时与长连接需分环节配置:DSN中加connect_timeout控制建连超时(PHP8.1+/TP6.1+有效),params中设PDO::ATTR_TIMEOUT控制SQL执行超时,启用pool配置get_timeout和max_active支持连接池,deploy=>1启用连接复用。

ThinkPHP 数据库配置里没有叫“timeout”的通用字段,也没有一键开启“长连接”的开关。所谓超时和长连接,必须拆到具体环节去配:建连卡住、取连接等太久、SQL 执行慢、连接被 MySQL 主动断开——每个环节用的参数、单位、生效条件都不同。
DSN 中加 connect_timeout 控制 TCP 建连超时
这是第一道防线,防 DNS 解析慢或 IP 不可达导致卡几十秒。默认不带该参数,系统会按操作系统默认值(Linux 通常 75 秒)傻等。
- 把 hostname 改成 IP 地址,绕过 DNS,比如 'hostname' => '192.168.1.100'
- 在 DSN 字符串中显式加 ;connect_timeout=3,完整示例如:
mysql:host=192.168.1.100;port=3306;dbname=test;connect_timeout=3 - 注意:PHP 8.1+ 且 TP6.1+ 才真正透传该参数;若用 mysqlnd 驱动,可能被忽略,需实测验证
params 中设 PDO::ATTR_TIMEOUT 控制查询执行超时
这个值只在连接已建立的前提下起作用,管的是 SQL 执行阶段(比如锁表、大结果集遍历),不是建连。
- 必须写在 'params' => [\PDO::ATTR_TIMEOUT => 3],单位是秒
- 写成 'timeout' => 3 或 'connect_timeout' => 3 都无效
- 搭配 'break_reconnect' => true 使用,否则连接异常后不会自动重试
- TP6.0 及更早版本可能不读取该配置,确认 ORM 版本为 think-orm v3.0+
启用连接池并配好 get_timeout 和 max_active
只有 TP6.1 + think-orm v3.0+ 才真正支持连接池;TP5.x 和 TP6.0 的 pool 配置完全无效。
- 数据库配置中必须含 'pool' => ['max_active' => 20, 'get_timeout' => 1000],不是顶层 pool,而是嵌在 mysql 节点下
- max_active 是硬限制:最多 20 个正在执行 SQL 的连接,超了就排队或报错
- get_timeout 单位是毫秒:从池里取连接最多等 1 秒,超时抛 PDOException
- 别只调大 get_timeout,得同步检查 MySQL 的 wait_timeout ≥ 300,否则池里空闲连接已被 MySQL 断开,取出来立刻失效
deploy => 1 启用连接复用逻辑(非持久化但更可控)
TP6 不推荐 PDO 持久连接(PDO::ATTR_PERSISTENT),因为框架 Connection 类会在销毁时强制断开,导致 persistent 失效。更务实的做法是启用部署模式。
- 在数据库配置中加 'deploy' => 1,即使没配从库,也会激活连接复用机制
- 该机制对同配置、同库名的请求生效;换库名或改账号仍会新建连接
- 可选配 'pool_size' => 20 限制最大空闲连接数,防 MySQL 端耗尽
- CLI 模式下池有效;FPM 下每个 worker 独立池;Apache prefork 基本无效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











