PHP蓝绿发布核心是新旧版本并存、流量可切、状态隔离、秒级回退;需独立目录与配置、独立PHP-FPM进程池、Runtime目录分离、Nginx统一控制流量切换,并确保数据库向前兼容、验证监控覆盖核心链路与异步任务。

PHP蓝绿发布不是“多部署一套代码”那么简单,核心是让新旧版本并存、流量可切、状态隔离、秒级回退。它解决的不是“能不能上线”,而是“上线时用户有没有感知”和“出错时业务能不能立刻回到安全状态”这两个真实问题。
环境与服务必须完全隔离
蓝组和绿组不能共享任何运行时资源,否则会相互干扰甚至导致数据错乱。重点包括:
-
独立目录与配置:蓝环境(如
/var/www/app_blue)和绿环境(如/var/www/app_green)各自拥有完整副本,不共用.env;数据库连接、缓存地址、日志路径等都需指向对应环境 -
独立 PHP-FPM 进程池:为蓝、绿分别配置不同监听端口(如
9001和9002),避免进程争抢或配置覆盖 -
Runtime 目录分离:修改框架配置(如 Laravel 的
config/app.php或 TP8.0 的runtime_path),确保cache、logs、sessions等目录互不交叉
Nginx 是流量切换的关键枢纽
所有请求入口由 Nginx 统一控制,通过 upstream 指向决定走哪个版本。典型配置如下:
upstream app_blue { server 127.0.0.1:9001; }
upstream app_green { server 127.0.0.1:9002; }
server {
listen 80;
location / {
proxy_pass http://app_blue;
}
}
立即学习“PHP免费学习笔记(深入)”;
发布时只需修改 proxy_pass 指向,并执行 nginx -s reload,无需重启服务,毫秒级生效。异常时改回原配置再 reload,就是一次完整回滚。
数据库与状态迁移必须向前兼容
蓝绿发布下,新旧版本可能同时读写同一套数据库,因此不能依赖“回滚代码=回滚数据”。关键原则是:
-
禁止破坏性 DDL:上线前禁用直接
DROP COLUMN、ALTER TABLE ... CHANGE等操作;改用 Expand-Migrate-Contract 模式(先加字段 → 迁移数据 → 清理旧字段) -
迁移脚本需幂等:Laravel 的
php artisan migrate天然支持重复执行不报错;自定义 SQL 脚本要加判断,例如检查索引是否存在再创建 - Session 和缓存要可跨版本读取:避免使用 PHP 8.6 新增的序列化格式写入 Redis,防止旧版 PHP 无法反解;建议统一用 JSON 格式存储关键会话数据
验证与监控不能只看“服务起来了”
切流后真正的考验才开始。必须在真实流量下确认三件事:
- 核心链路通不通:模拟登录、下单、支付回调等主流程,验证接口返回、跳转、状态变更是否符合预期
- 错误率与延迟稳不稳:对比切换前后 5 分钟内的 5xx 错误率、P95 响应时间,发现突增立即切回
- 异步任务跑不跑偏:检查队列消费者是否正常拉取、处理、重试;特别关注定时任务(如 Laravel Scheduler)是否因环境变量或时区差异漏执行



















