需同步调整三处:修改php.ini(error_reporting=E_ALL、display_errors=On、display_startup_errors=On)、启用--debug参数、在public/index.php顶部注册set_exception_handler捕获未处理异常。

FrankenPHP 1.5 默认隐藏 PHP 错误和异常堆栈,这是出于安全考虑。要让它在开发中显示完整错误信息(包括语法错误、运行时警告、未捕获异常的堆栈),需同步调整三处:PHP 运行时配置、FrankenPHP 启动参数、以及应用层异常处理器。
修改 php.ini 中的错误报告设置
FrankenPHP 使用嵌入式 PHP SAPI,完全遵循 php.ini 配置。确保以下几项生效(推荐在开发环境专用的 php.ini 或通过 php -c 指定配置文件):
- error_reporting = E_ALL —— 报告所有错误类型,含 notice 和 deprecated
- display_errors = On —— 让错误直接输出到 HTTP 响应体(仅限本地/开发,切勿用于线上)
- display_startup_errors = On —— 显示 PHP 启动阶段(如扩展加载失败)的错误
-
log_errors = On —— 同时启用日志记录,并确认
error_log路径可写(例如/tmp/php-errors.log)
启用 FrankenPHP 的 --debug 模式
FrankenPHP 1.5 的 --debug 参数会增强异常可见性,并在响应头中添加调试标识(如 X-PHP-Exception),方便配合浏览器 Network 面板定位问题:
- 命令行启动:
frankenphp serve --debug --config frankenphp.yaml - Docker 启动:添加环境变量
FRANKENPHP_DEBUG=1 - 注意:
--debug不替代 PHP 错误配置,它只影响 FrankenPHP 自身日志与异常透出逻辑
在入口文件注册 set_exception_handler
FrankenPHP 不自动将未捕获异常渲染为 HTML 页面。必须在 public/index.php(或你实际的前端控制器)顶部手动注册处理器:
立即学习“PHP免费学习笔记(深入)”;
set_exception_handler(function($e) {
error_log($e->__toString());
if (getenv('APP_ENV') === 'dev') {
http_response_code(500);
echo '<pre>' . htmlspecialchars($e->getTraceAsString()) . '</pre>';
} else {
echo json_encode(['error' => 'Internal server error']);
}
});
这样即使某段代码没加 try/catch,也能看到完整堆栈;生产环境则返回统一提示,避免信息泄露。
检查是否被框架中间件拦截
如果你用 Laravel、Symfony 或自定义中间件,它们常会提前 catch 异常并静默处理:
- Laravel:确认
APP_DEBUG=true,并检查app/Exceptions/Handler.php的render()方法是否屏蔽了 trace - Symfony:设置
DEBUG=1,并检查Kernel::registerBundles()是否启用了 DebugBundle - 临时注释中间件逻辑,验证原始异常能否暴露,可快速判断是否是框架层吞掉了错误



















