frankenphp默认不显示异常堆栈以保障安全,开发中需同时调整php.ini错误配置(error_reporting=e_all、display_errors=on)、启用--debug参数,并在入口文件注册set_exception_handler捕获未处理异常。

FrankenPHP 默认不暴露异常堆栈,主要是出于安全和生产环境规范考虑。要让它在开发中显示完整堆栈信息,需从 PHP 配置、FrankenPHP 运行模式和错误报告级别三方面同时调整。
确认 PHP 错误报告已开启
FrankenPHP 使用嵌入式 PHP SAPI,其行为受 php.ini 控制。确保以下配置生效:
-
error_reporting 设为
E_ALL(开发环境)或至少E_ALL & ~E_NOTICE -
display_errors 设为
On(仅限本地/开发环境,切勿上线) -
display_startup_errors 设为
On(捕获启动阶段异常) -
log_errors 设为
On,并检查 error_log 路径是否可写
启用 FrankenPHP 的调试模式
FrankenPHP 提供 --debug 启动参数,会增强日志输出并让未捕获异常更显式:
- 运行命令示例:
frankenphp serve --debug --config frankenphp.yaml - 若用 Docker,添加环境变量:
FRANKENPHP_DEBUG=1 - 该模式下,HTTP 响应头会包含
X-PHP-Exception等调试标识,配合浏览器开发者工具 Network 面板可快速定位
手动触发并捕获未处理异常
FrankenPHP 不自动拦截未捕获异常到 HTML 页面,需主动注册处理器:
- 在入口脚本(如
public/index.php)顶部添加:
set_exception_handler(function ($e) {<br> error_log($e->__toString());<br> if (getenv('APP_ENV') === 'dev') {<br> http_response_code(500);<br> echo '<pre class="brush:php;toolbar:false;">' . htmlspecialchars($e->getTraceAsString()) . ''; } else {
echo json_encode(['error' => 'Internal server error']);
}
});
- 这样即使异常未被 try-catch 捕获,也能看到堆栈;生产环境则只返回通用提示
检查是否被框架或中间件吞掉
如果你使用 Laravel、Symfony 或自定义中间件,它们常会提前 catch 异常并静默处理:
- 临时注释掉中间件逻辑,验证原始异常是否可见
- Laravel 用户可查看
app/Exceptions/Handler.php中的render()方法是否调用了$response->withException($e)并屏蔽了 trace - 启用
APP_DEBUG=true(Laravel)或DEBUG=1(Symfony)确保框架级调试开启
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











