thinkphp本身不感知aurora serverless v2自动扩缩容,需显式配置connect_timeout=20、wait_timeout=28800、persistent=false,并禁用持久连接、开启trace_sql、限制事务边界、合理设置minacu以适配其动态扩缩特性。

ThinkPHP 本身不感知 Aurora Serverless 的自动扩缩容,它只把数据库当做一个标准 MySQL 兼容端点来用;真正起作用的是连接池行为、超时配置和 Aurora 自身的扩缩策略 —— 配置不当,冷启动或突发扩容时就会连不上、查超时、事务中断。
ThinkPHP 数据库配置必须显式设置 connect_timeout 和 wait_timeout
Aurora Serverless v2 启用自动暂停(SecondsUntilAutoPause)后,空闲 5 分钟默认会暂停;恢复需约 15 秒。若 ThinkPHP 的 PDO 连接未设超时,mysql_connect 或 PDO::__construct 会卡住远超这个时间,最终报错 SQLSTATE[HY000] [2002] Connection refused 或 Can't connect to MySQL server。
-
'params' => ['connect_timeout' => 20, 'wait_timeout' => 28800]必须加进数据库配置的params数组(非dsn字符串) -
connect_timeout=20确保连接建立阶段能撑过冷启动期;低于 15 秒有失败风险 -
wait_timeout建议设为 28800(8 小时),避免 Aurora 主动踢掉长空闲连接导致 ThinkPHP 报MySQL server has gone away - 不要在
dsn里写?connect_timeout=20—— ThinkPHP 8.x 及以前版本对 DSN 参数解析不一致,PDO 可能忽略它
连接池与长连接必须关掉:禁用 persistent
Aurora Serverless 的扩缩是动态的,IP 和后端实例可能随时变化;复用持久连接(persistent => true)会导致连接指向已销毁的旧计算节点,出现间歇性 Lost connection to MySQL server during query 或乱码响应。
ThinkPHP 8.1.0 正式发布,深度优化路由与验证机制,完美兼容 PHP 8.4。本版本修复了数组路由配置异常,新增枚举值校验与高级数组验证功能,支持路由分类默认处理。作为高性能 PHP 框架的最新迭代,它延续了简洁实用的设计原则,提供更稳定的底层架构与更流畅的开发体验,助力开发者快速构建现代化 Web 应用与企业级系统。
- ThinkPHP 配置中明确设
'persistent' => false(即使文档没提,默认也是 false,但务必显式写出来) - 禁用 MySQLi 的
MYSQLI_OPT_CONNECT_TIMEOUT外部设置,它和 PDO 不兼容 - 如果用了 Swoole + ThinkPHP,必须配合
Db::close()在协程结束前释放连接,否则连接会滞留在已缩容的 ACU 上
查询慢日志与 ACU 扩容阈值要对齐
Aurora Serverless v2 扩容触发依赖实时指标:CPU > 70% 持续 10 秒、查询队列深度 > 50、内存压力 > 75%。ThinkPHP 默认不记录慢查,你无法判断是 SQL 本身拖垮了 ACU,还是扩缩滞后导致排队堆积。
- 在
database.php中开启'trace_sql' => true,并用中间件捕获执行时间 > 500ms 的查询,打标记录 - 在 AWS 控制台将集群的
MinACU设为 1.0(不是 0.5),避免低负载下频繁在 0.5 ↔ 1.0 之间抖动;v2 最小粒度是 0.5 ACU,但 0.5 容易因瞬时毛刺误扩容 - 避免在 ThinkPHP 的
where链式调用里拼接未绑定参数的原生 SQL,这类语句容易绕过预处理,触发 Aurora 的查询计划缓存失效,间接拉高 CPU
事务边界必须短,不能跨 HTTP 请求生命周期
Aurora Serverless 缩容时会终止空闲连接,但不会中断正在执行的事务;如果 ThinkPHP 把一个事务从请求开始拖到响应结束(比如在控制器里 startTrans → 多个 model 操作 → commit),而此时 ACU 正在缩减,事务可能卡在提交阶段,最终被 Aurora 强制 kill,报 Lock wait timeout exceeded 或 Transaction was rolled back due to capacity reduction(AWS 内部错误码)。
- 事务块必须限制在单个业务方法内,且总耗时建议 Db::transaction(function () { ... }) 而非手动
startTrans - 禁止在
__destruct或__sleep里做 commit —— PHP 生命周期结束时连接可能已断 - 如果必须长事务(如导入),改用 Aurora Serverless v2 的
MaxACU锁定上限,并配合 RDS Proxy 缓冲连接,但代价是失去“缩到零”的成本优势
最常被忽略的一点:Aurora Serverless v2 的自动暂停功能在启用 RDS Proxy 时会完全失效 —— 如果你在架构里加了代理,SecondsUntilAutoPause 就不起作用,数据库永远无法缩到零。这点在 ThinkPHP 配置里看不到,但决定你是否真能省下闲置费用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










