生产环境部署FrankenPHP必须关闭所有调试功能:设APP_DEBUG=0、display_errors=Off、log_errors=On、hot_reload=false、metrics.enable=false,移除FRANKENPHP_DEV_MODE,并同步关闭Laravel/Symfony等框架调试开关。

生产环境部署 FrankenPHP 时,必须关闭所有调试相关功能,否则会带来性能下降、信息泄露甚至安全风险。核心原则是:禁用开发专用行为,启用稳定、精简、静默的运行模式。
必须关闭的 PHP 级调试选项
这些配置直接影响 PHP 解释器的行为,需在 .env 或 PHP 配置文件中显式设为禁用:
- APP_DEBUG=0:彻底关闭框架级调试(如 Laravel/Symfony 的错误详情页、调试工具栏)
- display_errors=Off:禁止将错误信息输出到 HTTP 响应体,防止敏感路径、变量名、数据库结构泄露
- log_errors=On(推荐):错误仍记录到日志,但不暴露给用户;配合 error_log=/var/log/frankenphp/error.log 指定位置
- opcache.enable_cli=0(如使用 CLI 模式):CLI 下通常不需 OPcache,开启反而浪费内存
必须关闭的 FrankenPHP 自身调试功能
FrankenPHP 提供了一些便于开发的特性,生产中需主动禁用:
- hot_reload: false:关闭热重载。该功能监听文件变化并自动重启 worker,会引入 I/O 开销和不确定性,且依赖文件系统事件,在容器或只读文件系统中可能失效
- metrics: enable: false(或仅在内网暴露):Prometheus 指标端口(默认 9090)不应对外网开放;若需监控,应通过反向代理限制访问 IP 或关闭
- 移除 FRANKENPHP_DEV_MODE 环境变量:该变量会隐式启用调试日志、宽松 CORS、未压缩响应等非生产行为
框架与应用层需同步关闭的调试项
即使 FrankenPHP 配置正确,上层框架仍可能保留调试开关,必须一并处理:
立即学习“PHP免费学习笔记(深入)”;
- Laravel:确认 APP_ENV=prod,且 APP_DEBUG=0 已生效(检查
phpinfo()或config('app.debug')) - Symfony:确保 APP_ENV=prod 且 APP_DEBUG=0,并执行
php bin/console cache:warmup --env=prod - 自定义日志级别设为 error 或 warning,避免
debug级别日志写入磁盘造成 I/O 压力
额外建议:验证是否真正关闭
部署后快速检查三项:
- 访问一个不存在的路由,应返回标准 404 页面,而非带堆栈跟踪的调试页面
- 触发一个 PHP 错误(如
trigger_error('test', E_USER_ERROR)),响应中不应出现错误详情,仅返回 500 状态码 - 查看进程启动日志(
journalctl -u frankenphp -n 20或容器日志),确认无Hot reload enabled、Development mode等字样



















