PHP集群部署核心是解决共享状态、数据一致性与请求分发;需用Redis集中存储session、主从库读写分离、对象存储替代本地上传、CDN分发静态资源,并严格对齐各组件时间窗口。

PHP 集群部署不是学“怎么写 PHP 代码”,而是学“怎么让多台服务器上的 PHP 实例协同工作”。它不依赖某个框架或语法特性,核心是解决共享状态、数据一致性、请求分发这三件事。跳过架构直接写代码,迟早掉坑里。
PHP 应用怎么避免 session 在集群中丢失
默认 session_start() 把会话存在本地文件,多节点时各管各的,用户刷新就登出。
- 必须改用集中式存储:Redis 是首选,配置
session.save_handler = redis和session.save_path = "tcp://redis:6379"(注意不能写127.0.0.1,容器或跨主机要填服务名或真实 IP) - 不要用数据库存 session —— 并发高时容易成瓶颈,除非你加了连接池和读写分离
- 如果硬要用文件共享(比如 NFS),得确保所有节点挂载路径一致、UID/GID 权限对齐,且 NFS 启用
noac参数避免属性缓存导致 session 写入延迟 -
session.cookie_httponly和session.cookie_secure要统一开启,否则 HTTPS 环境下 Cookie 可能被拒绝发送
PHP 代码里怎么识别主从数据库并做读写分离
原生 PDO 不支持自动路由,得靠你自己控制连接逻辑,或者用封装层。
- 手动判断最简单:读操作连
DB_SLAVE_HOST,写操作连DB_MASTER_HOST,但得在每次new PDO()前做分支判断 - 用
Doctrine DBAL或Laravel 的 DB::connection('read')这类抽象层,它们内部维护多个连接池,自动按 query 类型分发 - 千万别在事务里混用读从库 ——
SELECT ... FOR UPDATE必须走主库,否则报错或锁失效 - 主从延迟超过 500ms 时,刚写入的数据立刻查可能查不到;关键业务(如支付回调后查订单)要强制走主库,加个
DB::connection('write')显式指定
PHP 静态资源和上传文件怎么在集群中保持一致
每个节点自己存一份上传文件?用户上传到 A 节点,下次请求落到 B 节点就 404 —— 这是最常见翻车点。
- 绝对不要用本地目录存用户上传文件。NFS 可行但性能差、单点故障风险高;推荐对象存储(OSS/S3),PHP 用
aws/aws-sdk-php或league/flysystem-aws-s3-v3直接对接 - 静态资源(CSS/JS/图片)建议走 CDN,源站只保留一份,CDN 自动缓存和回源
- 如果非要用共享存储,NFS 挂载后必须检查
stat /path/to/upload在所有节点返回相同 inode 和 mtime,否则 Laravel 的Storage::url()可能生成错误路径 -
file_exists()、is_file()这类函数在 NFS 上极慢,别在循环里频繁调用;改用预生成 URL 或缓存元数据
Kubernetes 下 PHP 容器为什么经常重启或就绪失败
不是代码问题,大概率是探针配置和启动顺序没对上。
立即学习“PHP免费学习笔记(深入)”;
-
readinessProbe别直接curl http://localhost/health—— Nginx 没起来时 PHP-FPM 已运行,但 HTTP 请求根本进不来,导致就绪失败、流量被切走 - 正确做法:PHP-FPM 容器里加一个
/healthz脚本,只检查php-fpm -t和ps aux | grep php-fpm,不依赖 Web 服务器 -
livenessProbe如果设太短(比如 5 秒),PHP-FPM 加载 OPcache 或 Composer autoload 时卡住几秒,就会被误杀 - 多阶段构建镜像时,别把
composer install放进最终镜像的启动命令里 ——ENTRYPOINT执行慢,K8s 会等超时后重启容器



















