ThinkPHP8.1分布式集群落地需四步:一、Redis统一Session管理;二、Nginx反向代理与负载均衡;三、集中化文件存储、缓存及日志;四、保障数据库一致性、代码发布可靠性和异步任务统一调度。

ThinkPHP8.1 搭建分布式集群环境,核心不是改框架本身,而是围绕“多节点协同”重构基础设施。它不内置集群能力,需通过外部组件解耦状态、统一资源、协调流量。以下四点是落地关键。
一、用 Redis 统一管理 Session
默认 file 驱动在多服务器下必然失效——每台机器写本地文件,用户轮到不同节点就丢失登录态。必须切换为共享存储:
- 在 config/session.php 中明确配置:
'type' => 'redis',<br>'host' => '10.0.1.200', // 内网真实 IP,禁用 127.0.0.1<br>'port' => 6379,<br>'password' => 'user:pass', // Redis 6+ ACL 认证格式<br>'database' => 2,<br>'prefix' => 'tp8_app_prod_', // 强制加前缀,避免多项目 key 冲突<br>'serialize' => 'php' // 若兼容老系统或含资源句柄,显式指定序列化方式
- 确保所有 Web 服务器能直连该 Redis 实例(检查内网连通性、安全组/防火墙放行 6379)
- TP8.1 要求 PHP redis 扩展版本 ≥ 5.3,且启用
ext-redis(非 phpredis 别名)
二、用 Nginx 做反向代理与负载均衡
单靠应用层无法实现请求分发,必须前置一层流量调度器:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 在 Nginx 配置中定义 upstream 组,例如:
upstream tp8_cluster {<br> server 192.168.5.101:80 weight=3;<br> server 192.168.5.102:80 weight=3;<br> server 192.168.5.103:80 max_fails=2 fail_timeout=30s;<br>} - 在 server 块中透传真实客户端信息:
proxy_set_header X-Real-IP $remote_addr;<br>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>proxy_set_header Host $host;
- 不建议开启 ip_hash(会破坏负载均衡弹性),Session 已由 Redis 托管,无需绑定固定节点
三、集中化文件与缓存资源
上传文件、静态资源、应用缓存若散落在各节点,会导致内容不一致或 404:
立即学习“PHP免费学习笔记(深入)”;
-
文件存储:弃用本地 uploads 目录,改用 OSS(阿里云/腾讯云)、S3 兼容对象存储,或 NFS(小规模内网可用)。TP8 的
think\File支持自定义驱动,配置filesystems.disks.oss即可全局生效 -
应用缓存:关闭 file 缓存驱动,在
config/cache.php中设'default' => 'redis',复用同一套 Redis 实例(建议用不同 database 或 prefix 隔离) - 日志集中:不依赖本地文件,接入 ELK 或使用 Monolog + Redis/UDP 发送到日志中心
四、保障数据一致性与发布可靠性
多节点部署后,数据库、代码、任务等环节易出现状态漂移:
-
数据库:主从分离是基础,读操作走从库(TP8 支持
db()->connect('slave')),写操作强制走主库;高并发写场景建议引入分布式锁(如 RedLock + Redis)控制临界资源 - 代码部署:用 Ansible / Jenkins 实现多机并行推送,或通过共享挂载点(如 NFS)让所有节点读同一份代码,配合软链切换版本
-
异步任务:禁用
think-queue的 file 驱动,改用 Redis List 或 Stream 驱动;worker 进程需在每台服务器上独立运行,但共用同一个队列源


















