ThinkPHP可通过二级域名实现灰度发布:配置域名部署、独立应用目录、Nginx环境变量隔离、中间件强制测试库连接、API前缀区分及CDN缓存隔离,确保灰度与生产环境完全隔离且可快速回滚。

ThinkPHP 本身不内置灰度发布能力,二级域名也不是天然支持灰度的通道。但你可以把二级域名作为灰度环境的入口标识,配合中间件和配置中心,实现测试子域名(如 test.example.com)与生产主站(www.example.com 或 example.com)的逻辑隔离——不是靠复制项目,而是靠运行时判断+路由分流。
用子域名作为灰度开关标识
把灰度环境固定绑定到一个明确的二级域名(比如 test.example.com),比用 Header 或用户 ID 分桶更简单、可控,也更适合预发验证和小流量试跑。
- 在
config/app.php中开启域名部署:'url_domain_deploy' => true - 在
app/route.php中显式注册灰度域名:Route::domain('test', 'test');—— 这会把所有test.example.com的请求导向app/test/应用目录 - 确保
app/test/是一个独立应用(用php think build test创建),拥有自己的控制器、中间件、数据库配置等,与app/index/物理隔离
Nginx 配置需区分灰度与生产流量
Web 服务器不能只做泛解析,必须让灰度子域名走独立配置,避免 SSL、日志、缓存策略混用。
- 为
test.example.com单独写一个server块,root 指向同一项目 public 目录,但通过fastcgi_param注入环境变量:fastcgi_param THINK_ENV 'test'; - 主站
www.example.com和根域名example.com共用另一个 server 块,注入THINK_ENV 'prod' - PHP 层可通过
$_SERVER['THINK_ENV']判断当前上下文,在中间件或数据库连接中自动加载对应配置
灰度子域名下的路由与数据隔离
仅靠应用目录隔离还不够,关键是要防止灰度请求误触生产数据或接口。
立即学习“PHP免费学习笔记(深入)”;
- 在
app/test/middleware.php中注册一个前置中间件,检查请求来源是否为test.example.com,并强制设置数据库连接为测试库(如db_test) - API 接口层统一加前缀(如
/api/v1/gray/xxx),避免与生产/api/v1/xxx路由冲突 - 静态资源(CSS/JS)使用带版本号或哈希值的 URL,并在灰度环境下启用 CDN 缓存隔离策略,防止浏览器缓存污染
上线前验证与回滚准备
灰度子域名不是“随便改改就上线”,它必须可验证、可关闭、不影响主站。
- DNS 层面:灰度子域名用 CNAME 指向独立的预发集群 IP,而非复用生产负载均衡器
- 健康检查:在
test.example.com/ping提供轻量接口,返回当前环境名、Git commit、数据库连接状态,便于自动化巡检 - 快速下线:只需注释掉 Nginx 中
test.example.com的 server 块,或修改 DNS TTL 后秒级切回 404,无需动代码或重启 PHP-FPM



















