必须同步修改 php.ini 错误配置、启动时加 --debug 参数、在 public/index.php 顶部注册 set_exception_handler——缺一不可,否则仍返回空白页或 500 错误。

在 macOS 上让 FrankenPHP v1.3 显示 PHP 错误堆栈、捕获未处理异常并输出调试信息,必须同步完成三处不可省略的操作:修改其实际加载的 php.ini 配置、启动时启用 --debug 模式、并在 public/index.php 顶部注册异常处理器——漏掉任意一项,页面仍会返回空白或 500 错误。
确认 FrankenPHP 实际加载的 php.ini 路径
FrankenPHP v1.3 在 macOS 上不读取 /usr/local/etc/php/php.ini 或 Homebrew 的默认路径,它用的是编译时嵌入或构建时指定的配置。先查清真实路径:
运行 ./frankenphp php-cli -i | grep "Loaded Configuration File",观察输出。若返回 none,说明当前二进制使用的是内置默认配置,【你无法通过编辑文件系统上的 php.ini 来生效】;若返回具体路径(如 /opt/homebrew/Cellar/frankenphp/1.3.0/lib/php.ini),则用编辑器打开该文件。
修改 php.ini 中的错误报告配置
在上一步确认的 php.ini 文件中,找到并修改以下三行(没有就新增):
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
保存后无需重启 macOS 系统,但必须终止当前 FrankenPHP 进程(Ctrl+C),再重新启动服务才生效。注意:log_errors 和 error_log 不影响页面调试输出,仅控制日志文件,此处可暂不设置。
启动 FrankenPHP 时加 --debug 参数
进入项目根目录,执行:
./frankenphp serve --debug --document-root ./public
--debug 不是可选开关,它强制 FrankenPHP 在响应头注入 X-PHP-Exception,并让 panic 和未捕获异常直接冒泡到 stderr。不加这个参数,即使 php.ini 全开,你也看不到 HTML 堆栈,只收到 500 响应。
验证是否生效:用终端执行 curl -I http://localhost:8080/invalid.php(访问一个不存在或语法错误的 PHP 文件),若响应头中出现 X-PHP-Exception: 字样,说明 --debug 已激活。
在入口文件注册 set_exception_handler
这是最容易被跳过的一步,也是导致“改了 php.ini 和 --debug 还是白屏”的根本原因。
打开 public/index.php,确保它是文件第一行(任何输出、include、require 之前),插入以下代码:
set_exception_handler(function($e) {<br> http_response_code(500);<br> echo '<pre class="brush:php;toolbar:false;">' . htmlspecialchars($e->getTraceAsString()) . '';});
这段代码只对未被 try/catch 拦截的异常起作用。如果你用 Laravel 等框架,需临时注释掉 app/Exceptions/Handler.php 中的 render() 方法,否则框架会提前吞掉异常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











