frankenphp启动symfony时,app_env和app_debug必须通过操作系统环境变量注入,而非.env.local文件,因其php运行时不执行symfony的dotenv组件。

直接改 .env.local 不生效?别动框架配置文件
FrankenPHP 启动 Symfony 时,APP_DEBUG 和 APP_ENV 必须由环境变量注入,而不是靠 .env 或 .env.local 文件自动加载。因为 FrankenPHP 的 PHP 运行时在启动时不会执行 Composer 的 autoloader 初始化逻辑,也不会触发 Symfony 的 Dotenv 组件——它只认操作系统级的环境变量。
常见错误是:在项目根目录下写了 APP_DEBUG=0 到 .env.local,然后直接运行 frankenphp php-server,结果 debug_toolbar 依然显示、错误页面还是完整堆栈。
- 必须用
APP_ENV=prod APP_DEBUG=0 frankenphp php-server方式启动 - Docker 场景下,改
compose.yaml的environment字段,不是往镜像里塞.env - 如果用了
docker build打包,ENV APP_ENV prod要写在 Dockerfile 最末尾,否则会被基础镜像里的默认值覆盖
composer install --no-dev 是硬性前提,不是可选项
Symfony 在生产模式下会跳过 dev 相关的包(如 symfony/debug-bundle、symfony/web-profiler-bundle),但前提是这些包根本没被安装。如果 vendor/ 里还留着它们,即使 APP_DEBUG=0,某些钩子仍可能被意外触发(比如异常处理器未完全禁用)。
正确做法是彻底清理依赖树:
- 运行
composer install --no-dev --optimize-autoloader --ignore-platform-reqs -
--optimize-autoloader强制生成 classmap,避免运行时动态解析 -
--ignore-platform-reqs防止 FrankenPHP 内置 PHP 版本(如 8.5)和 composer.lock 中声明的版本不一致导致失败 - 确认
vendor/bin/simple-phpunit、vendor/symfony/web-profiler-bundle等路径已不存在
Worker 模式下,环境变量必须在启动前固化
Symfony 的 worker 模式(frankenphp worker)会让应用常驻内存,所有后续请求复用同一份初始化后的容器。这意味着:环境变量只读取一次,之后改 APP_DEBUG 环境变量也无效,必须重启进程。
更隐蔽的问题是,如果你在 public/index.php 里手动调用 putenv('APP_DEBUG=0'),它只影响当前请求,对 worker 生命周期无意义。
- 必须在执行
frankenphp worker命令前,用 shell 设置好全部环境变量 - 推荐封装成启动脚本:
APP_ENV=prod APP_DEBUG=0 FRANKENPHP_WORKER_SCRIPT=public/index.php frankenphp worker - 检查
phpinfo()输出页的Environment区域,确认APP_DEBUG显示为0,而非string(1) "0"(后者说明是字符串类型,可能被某些旧版 Bundle 错误识别)
OPcache + 预加载不能绕过环境校验
有人试图用 OPcache 预加载(opcache.preload)加速启动,但 Symfony 的 Kernel::getCacheDir() 和 isDebug() 方法在预加载阶段就已执行。如果预加载脚本里硬编码了 $_SERVER['APP_DEBUG'] = true,或依赖了未被清除的 dev-only 配置,会导致调试模式“复活”。
安全做法是:
- 禁用任何自定义 preload.php;FrankenPHP 自带的
php.ini-production默认关闭opcache.preload - 确保
config/packages/dev/目录在打包前已被删除(rm -rf config/packages/dev) - 验证缓存是否重建:
rm -rf var/cache/* && APP_ENV=prod APP_DEBUG=0 php bin/console cache:warmup,再启动 FrankenPHP
最易忽略的一点:FrankenPHP 的 php-server 模式默认监听 :8000,但 Symfony 的 APP_ENV=prod 会强制跳转 HTTPS。若没配 Caddy 的自动重定向,首页可能 302 到 https://localhost 并失败——这不是调试模式问题,而是环境与反向代理配置错位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











