frankenphp 调试需三步并行:修改 php.ini 中 error_reporting、display_errors、display_startup_errors 为开启状态;启动时加 --debug 参数(或设 frankenphp_debug=1);并在 public/index.php 顶部注册 set_exception_handler。缺一不可,否则仅返回空白页或 500。

FrankenPHP 没有“debug 日志开关”这种全局 toggle,临时开启调试输出必须组合三处动作:改 PHP 错误级别、启用 FrankenPHP 的 --debug 模式、并在入口注册异常处理器——缺一不可,否则你只会看到空白页或 500。
改 php.ini 运行时错误配置(哪怕只改一行)
FrankenPHP 启动时加载的 php.ini 是固定的(可用 frankenphp php-cli -i | grep "Loaded Configuration File" 确认),不能靠 ini_set() 动态覆盖 display_errors 或 error_reporting 的底层行为。临时生效最稳的方式是:
- 找到实际生效的
php.ini路径,用编辑器打开 - 把这三行设为(开发机可直接改,别上生产):
error_reporting = E_ALLdisplay_errors = Ondisplay_startup_errors = On - 保存后无需重启系统服务,但需重启 FrankenPHP 进程(
Ctrl+C再frankenphp serve)
启动时加 --debug 参数并确认生效
--debug 不是日志级别开关,它会让 FrankenPHP 在 HTTP 响应头里注入 X-PHP-Exception、增强 panic 输出、并让未捕获异常更早冒泡到 stderr。不加这个,即使 PHP 报错,你也可能只看到 500 而无堆栈。
- 前台运行示例:
frankenphp serve --debug --document-root ./public - Docker 中加环境变量:
-e FRANKENPHP_DEBUG=1 - 验证是否生效:curl 一个会出错的 URL,用
curl -I查响应头,看到X-PHP-Exception就对了
在 public/index.php 顶部手动捕获未处理异常
FrankenPHP 默认不把未捕获异常渲染成 HTML 堆栈(不像传统 PHP-FPM + Apache),必须自己注册 set_exception_handler,否则 Fatal error 仍只返回空白或 500。
- 在
public/index.php第一行(任何输出之前)插入:
set_exception_handler(function($e) {
http_response_code(500);
echo '<pre class="brush:php;toolbar:false;">' . htmlspecialchars($e->getTraceAsString()) . '';
});
- 注意:这段代码只对未被
try/catch拦截的异常起作用;如果框架(如 Laravel)已接管异常,得先关掉它的APP_DEBUG=false或临时注释中间件 - 生产环境务必删掉或加
if (getenv('APP_ENV') === 'dev')包裹,避免泄露敏感路径
临时 debug 最容易漏掉的是第三步——很多人改完 php.ini 和 --debug,还是看不到堆栈,就是因为没在入口文件注册 handler。FrankenPHP 的异常流和传统架构不同,它不自动兜底,得你自己补上这一环。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











