ThinkPHP 8 原生缓存驱动没有独立的“连接池”配置项,在高并发 PHP-FPM 环境下,通常通过开启 Redis 持久连接来减少握手开销,但需注意连接数限制。
先说结论:框架层面不支持独立连接池配置,所谓的“连接池”在 PHP-FPM 模式下实为 Redis 持久连接(pconnect)。建议通过开启 persistent 选项优化,生产环境需严格评估 Redis 最大连接数。
- 适合:PHP-FPM 模式且 Redis 连接成为瓶颈的场景
- 先准备:确认服务器已安装 phpredis 扩展并验证版本
- 验收:通过 Redis 客户端监控连接数变化及请求延迟
原理与预期管理
ThinkPHP 8 的缓存驱动基于 topthink/cache 组件。在标准 PHP-FPM 环境下,脚本执行结束后连接通常会关闭。开启持久连接后,脚本结束时连接保持打开,供同一 worker 进程的下个请求复用。这并非真正的连接池管理(如 Swoole 协程池),不会主动回收空闲连接,因此需要控制并发。
前置检查
在终端执行命令确认 Redis 扩展已安装:
php -m | grep redis
如果没有输出,需要先安装 phpredis 扩展。注意确保扩展版本支持 persistent 参数。
完整配置步骤
编辑 config/cache.php 文件。ThinkPHP 8 的配置结构包含 stores 层级,需找到 redis 配置项并修改 persistent 参数。参考完整结构如下:
return [
'default' => env('CACHE_STORE', 'file'),
'stores' => [
'file' => [
'type' => 'file',
'path' => runtime_path() . 'cache/',
],
'redis' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'expire' => 0,
'persistent' => true, // 关键修改:开启持久连接
],
],
];修改完成后,重启 PHP-FPM 服务使配置生效。
服务端限制调整
开启持久连接后,PHP worker 进程会占用 Redis 连接不释放。需检查 Redis 服务的 maxclients 设置,确保大于 PHP-FPM 的最大子进程数。
计算公式参考:Redis maxclients ≥ PHP-FPM pm.max_children × 服务器节点数。
使用 redis-cli 查看当前限制:
redis-cli CONFIG GET maxclients
验证是否生效
- 使用 redis-cli 连接 Redis 服务器。
- 执行 info clients 命令查看 connected_clients 数量。
- 发起多次 Web 请求,观察连接数是否稳定在 PHP-FPM 进程数附近,而不是随请求量线性增长。
- 查看应用日志,确认没有 Redis 连接超时或拒绝连接的报错。
常见风险与排查
1. 连接数爆炸:如果 PHP-FPM 进程数过多且开启持久连接,可能耗尽 Redis 最大连接数,导致新请求失败。解决方案是调整 PHP-FPM 的 pm.max_children 或 Redis 的 maxclients。
2. 数据库选择状态污染:持久连接复用后,select 数据库的操作可能需要每次请求显式执行。虽然框架通常会处理,但在复杂场景下建议避免依赖持久连接中的 select 状态,避免污染其他业务数据。
3. 鉴权问题:部分旧版本 phpredis 扩展在持久连接复用时的密码验证可能存在异常,建议测试 auth 流程。
4. 非 FPM 环境:如果使用 Swoole 或 RoadRunner 运行 TP8,连接管理方式不同,无需此配置,应使用框架对应的协程客户端。
参考来源
- ThinkPHP 官方文档 - 缓存用法 (https://www.thinkphp.cn)
- phpredis 扩展 GitHub 仓库 - Persistent connections 说明 (https://github.com/phpredis/phpredis)