Laravel本身不提供数据库连接池,仅在Swoole/Octane等常驻内存环境中通过协程实现真正连接复用;FPM下“pool”配置无效,MongoDB驱动除外,其maxPoolSize等参数真实生效。

只在 Swoole 或 Laravel Octane 下才有效
这是唯一能实现协程级连接复用的路径。每个 Worker 进程持有一组预创建、可复用的长连接,避免每次请求都 TCP 握手和认证。
- 确认已启用 Swoole 扩展(≥4.8.0) 或使用
laravel/octane - MySQL 配置中必须把
host改成127.0.0.1,不能写localhost,否则走 Unix socket,连接池失效 - 在
config/database.php的 mysql 配置块中加入:'pool' => [ 'enabled' => true, 'max_connections' => 20, 'min_connections' => 5, ], 'options' => [ PDO::ATTR_TIMEOUT => 5, ] - 启动命令必须是
php artisan octane:start或php bin/laravels start,确保请求由常驻进程处理
FPM 环境下别折腾“连接池”,专注控连接数
PHP-FPM 没有跨请求连接复用能力,“pool” 配置字段完全被忽略。此时真正的瓶颈是:FPM worker 数 × 每请求新建连接数 ≥ MySQL 的 max_connections。
- 调低 MySQL 的
wait_timeout(建议 60–120 秒),防止 PHP 崩溃后连接长期 Sleep 占位 - 在 PDO options 中加
PDO::ATTR_TIMEOUT => 5,防慢查询卡死连接 - 队列任务里禁止循环查库,改用
whereIn批量拉取,减少连接往返 - 检查
SHOW GLOBAL STATUS LIKE 'Threads_connected',对比max_connections,确认是否真打满
MongoDB 是个例外:原生支持连接池
Laravel MongoDB 驱动(基于官方 C driver)真实解析并应用连接池参数,无需换运行环境。
- 配置
maxPoolSize(建议 CPU 核心数 × 2~4,如 8 核设为 16~32) - 配
minPoolSize(推荐maxPoolSize / 4,如 20 → 5) - 开启
'persistConnection' => true,否则每次请求仍重建连接 - 设
connectTimeoutMS(10000)和socketTimeoutMS(30000)防挂死
缓存层也得池化,尤其 Redis
高并发下 Redis 连接激增同样会触发 “Connection refused”,需同步优化。
- FPM 下用
phpredis+'persistent' => true,复用 TCP 连接 - Swoole 下用
Predis配合自定义协程连接工厂,实现真正池化 - 集群环境可部署
twemproxy或Redis Exporter + connection pool作为代理层 - 确保
.env中REDIS_CLIENT=phpredis且CACHE_DRIVER=redis


















