生产环境必须通过服务器环境变量设置app_env=prod和app_debug=false,禁用debug/web_profiler,配置doctrine连接池、redis缓存及monolog事件通道隔离,并确保app_secret由环境变量注入。

生产环境配置没优化,bin/console 命令跑得慢、页面加载卡顿、日志写满磁盘、数据库连接频繁超时——这些问题基本都出在配置没切到“真生产模式”,不是代码问题。
APP_ENV 和 APP_DEBUG 必须由服务器环境变量控制
别在 .env 里写 APP_ENV=prod,更别留 APP_DEBUG=true。这两项必须由 Web 服务器或系统级环境变量提前注入:
- Apache:在虚拟主机配置里加
SetEnv APP_ENV prod和SetEnv APP_DEBUG false - Nginx:在
fastcgi_param块中写fastcgi_param APP_ENV prod和fastcgi_param APP_DEBUG false - CLI 场景(如 cron):执行前用
APP_ENV=prod APP_DEBUG=false php bin/console ...
常见错误现象:bin/console debug:container --env-var=APP_ENV 显示 dev,或 $_ENV['APP_DEBUG'] 是 1;根源就是 Web 服务器没传,Symfony 回退到了默认值。
数据库连接池和超时参数要显式覆盖
Doctrine 默认的连接行为是“每次请求新建连接”,生产环境必须改掉。在 config/packages/doctrine.yaml 的 prod 配置块里强制设置:
-
pool_size: 20:连接池最小保活连接数,避免冷启动抖动 -
max_connections: 100:最大允许打开连接,配合数据库侧max_connections调整 -
connect_timeout: 5:连接建立失败上限,防雪崩 -
charset: utf8mb4和default_table_options.charset: utf8mb4:避免字符乱码和索引失效
注意:options 下的这些键必须写在 dbal: 同级缩进下,写错位置(比如塞进 url 里)就无效。
缓存和日志必须隔离通道、禁用调试组件
开发用的 debug 和 web_profiler 包不能出现在生产环境容器里。确认以下三点:
-
config/packages/prod/目录下没有debug.yaml或web_profiler.yaml,且config/bundles.php中不加载Symfony\Bundle\DebugBundle\DebugBundle::class -
monolog配置中禁用event通道(channels: ["!event"]),否则每个事件分发都会打日志,量级爆炸 - 使用
cache.adapter.redis或cache.adapter.psr6替代filesystem,避免磁盘 I/O 成瓶颈;framework.cache.type: pool必须启用
一个容易被忽略的点:APP_SECRET 必须通过服务器环境变量注入,绝不能硬编码在 YAML 或 .env.prod.local 里——后者虽比 .env 安全,但若文件权限失控仍可能泄露。











