frankenphp通过配置隔离实现环境分离:用不同caddyfile(如caddyfile.staging/caddyfile.prod)、显式-config参数启动、独立环境变量注入(app_env=staging/prod等)、物理隔离worker脚本和runtime目录,root路径与server_name必须严格一一对应。

FrankenPHP 本身不内置“环境切换”机制,测试和正式环境的分离完全靠配置隔离——不是改代码,而是换 Caddyfile、换环境变量、换运行时路径。
用不同 Caddyfile 文件区分环境
Caddy 默认只读当前目录的 Caddyfile,但你可以显式指定文件名启动,避免混用:
- 测试环境用
Caddyfile.staging:里面写staging.example.com域名、root * /app/public指向测试代码、php_ini display_errors On - 正式环境用
Caddyfile.prod:域名设为example.com、root * /app-prod/public(物理路径不同)、禁用display_errors、开启opcache.validate_timestamps 0 - 启动时加
-config参数:frankenphp php-server -config Caddyfile.staging,或 Docker 中用volumes映射对应文件
环境变量必须走独立注入,不能靠 .env 文件自动加载
FrankenPHP 不解析 .env,所有环境变量得由宿主环境或容器明确传入:
- 测试环境启动命令里加:
APP_ENV=staging APP_DEBUG=1 frankenphp php-server - 正式环境必须硬编码关键值:
APP_ENV=prod APP_DEBUG=0 SERVER_NAME=example.com frankenphp php-server - Docker Compose 中用
environment字段分别定义,不要 在Caddyfile里用{env.APP_ENV}—— Caddy 的模板语法在 FrankenPHP 的 PHP 上下文中不可靠 - PHP 代码里读取
$_ENV['APP_ENV']是安全的,但确保php.ini中variables_order = "EGPCS"(默认已含 E)
worker 模式下,入口脚本和 runtime 目录必须物理隔离
worker 进程会缓存框架初始化结果,测试和正式共用同一份 runtime/ 或同一入口脚本会导致状态污染:
- 测试环境用
public/worker-staging.php,正式环境用public/worker-prod.php,两者内容一致但路径不同(避免文件锁或缓存误读) - 确保
runtime/目录路径不共享:测试用/app-staging/runtime,正式用/app-prod/runtime;Linux 下建议chmod 755且属主为运行用户 - 如果用单文件打包(
frankenphp build),--server-name必须匹配对应环境域名,否则 Let’s Encrypt 申请失败或证书错配
最容易被忽略的是:Caddyfile 中的 root 路径和 SERVER_NAME 环境变量必须严格一一对应,漏掉任意一个,就可能让测试请求意外打到正式代码上——这种错误不会报错,只会静默返回错误内容。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











