ThinkPHP 8 如何配置 Redis 缓存驱动连接池

文章导读
ThinkPHP 8 原生缓存驱动没有独立的“连接池”配置项,在高并发 PHP-FPM 环境下,通常通过开启 Redis 持久连接来减少握手开销,但需注意连接数限制。
📋 目录
  1. A 原理与预期管理
  2. B 前置检查
  3. C 完整配置步骤
  4. D 服务端限制调整
  5. E 验证是否生效
  6. F 常见风险与排查
  7. G 参考来源
A A

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 扩展已安装:

ThinkPHP 8 如何配置 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 的最大子进程数。

ThinkPHP 8 如何配置 Redis 缓存驱动连接池

计算公式参考:Redis maxclients ≥ PHP-FPM pm.max_children × 服务器节点数。

使用 redis-cli 查看当前限制:

redis-cli CONFIG GET maxclients

验证是否生效

  1. 使用 redis-cli 连接 Redis 服务器。
  2. 执行 info clients 命令查看 connected_clients 数量。
  3. 发起多次 Web 请求,观察连接数是否稳定在 PHP-FPM 进程数附近,而不是随请求量线性增长。
  4. 查看应用日志,确认没有 Redis 连接超时或拒绝连接的报错。

常见风险与排查

1. 连接数爆炸:如果 PHP-FPM 进程数过多且开启持久连接,可能耗尽 Redis 最大连接数,导致新请求失败。解决方案是调整 PHP-FPM 的 pm.max_children 或 Redis 的 maxclients。

ThinkPHP 8 如何配置 Redis 缓存驱动连接池

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)