FrankenPHP默认不加载.env文件,需在public/index.php开头手动用Symfony/Dotenv加载;APP_ENV必须通过系统环境变量设置(如APP_ENV=prod),并清缓存或预生成.env.local.php。

FrankenPHP 默认不自动加载 .env 文件,也不执行 Dotenv::bootEnv(),所以直接依赖 $_SERVER['APP_ENV'] 会为空——这不是 Symfony 配置错了,而是 FrankenPHP 启动流程绕过了传统 PHP-FPM 的环境初始化环节。
FrankenPHP 启动时没加载 .env,怎么让 APP_ENV 生效
FrankenPHP 是 SAPI 层直接嵌入 PHP 的二进制,它不会自动调用 Dotenv::loadEnv(),也不会把 .env 注入 $_ENV 或 $_SERVER。你必须显式控制变量注入时机:
- 在
public/index.php开头手动加载 Dotenv(确保symfony/dotenv已安装):$dotenv = new \Symfony\Component\Dotenv\Dotenv(); $dotenv->loadEnv(dirname(__DIR__).'/.env');
- 如果用了
--env=prod这类 CLI 参数启动 FrankenPHP,它不会透传给应用;得改用操作系统级环境变量方式启动:APP_ENV=prod frankenphp run --worker
- 容器部署时,在
docker-compose.yml或 Kubernetesenv:下明确设置:environment: - APP_ENV=prod - APP_SECRET=...
APP_ENV=prod 但 config/packages/prod.yaml 没加载?检查缓存和入口逻辑
Symfony 加载环境专属配置(如 config/packages/prod.yaml)只依赖运行时 APP_ENV 值,但前提是容器构建时该值已确定。FrankenPHP 下容易踩的坑是:缓存没清、或 Kernel::getEnvironment() 被覆盖。
- 确认
Kernel类里没硬编码return 'dev';—— 它应该返回$_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? 'dev' - 每次切换
APP_ENV后必须清缓存:php bin/console cache:clear --env=prod,否则旧容器仍按 dev 编译 - FrankenPHP 的 worker 模式会复用进程,若缓存未清,
APP_ENV变更可能被忽略——建议加--no-cache调试,或重启 worker
生产环境别依赖 .env 文本文件,用 dotenv:dump 预编译
FrankenPHP 在生产中频繁解析 .env 有性能损耗,且 Dotenv::loadEnv() 在某些 FrankenPHP 版本下可能被禁用(如启用 --no-env)。更稳的方式是预生成 PHP 配置文件:
立即学习“PHP免费学习笔记(深入)”;
- 本地执行:
php bin/console dotenv:dump --format=php --env=prod,生成.env.local.php - 部署时只传这个 PHP 文件,FrankenPHP 会自动 require 它(无需 Dotenv 组件)
- 此时
APP_ENV必须与 dump 时一致,否则.env.local.php不生效——例如 dump 时用--env=prod,运行时就得设APP_ENV=prod
FrankenPHP 的环境变量传递本质是「操作系统级注入」,不是框架魔术。最易忽略的是:.env 文件本身在 FrankenPHP 下完全不生效,除非你亲手加载它;而一旦用了 dotenv:dump,.env 就彻底退场了——连 .env.local 都会被忽略。



















