必须手动开启 display_errors 并匹配 error_reporting 级别才能在浏览器显示 PHP 报错;先用 frankenphp php-cli -i 确认实际加载的 php.ini 路径,再修改其中 display_errors = On、display_startup_errors = On、error_reporting = E_ALL,保存后重启 FrankenPHP 服务即可生效。

在 macOS 上使用 FrankenPHP v1.3 时,若访问页面只显示空白或 500 错误而看不到具体 PHP 报错信息,说明错误显示被禁用——这并非 FrankenPHP 默认隐藏,而是它完全依赖 PHP 的原生配置,必须手动开启 display_errors 并匹配 error_reporting 级别才能让错误浮现在浏览器中。
确认 FrankenPHP 实际加载的 php.ini 路径
FrankenPHP v1.3 在 macOS 上可能不读取 /usr/local/etc/php/php.ini,而是 fallback 到内置配置或 Homebrew 安装路径下的独立 ini 文件。直接改错位置会导致所有配置失效。
打开终端,运行:
frankenphp php-cli -i | grep "Loaded Configuration File"
若输出为空或显示 none,说明当前使用的是编译内建 php.ini;若显示路径(如 /opt/homebrew/etc/php/8.3/php.ini),则必须编辑该文件——不要修改其他位置的 php.ini。
立即学习“PHP免费学习笔记(深入)”;
开启 PHP 错误显示(开发专用)
用文本编辑器打开上一步确认的 php.ini 文件,在其中找到并修改以下三行:
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
注意:macOS 上某些 Homebrew PHP 版本(如 8.2+)支持 error_reporting = -1,它比 E_ALL 更彻底,能覆盖未来新增的错误类型;但若不确定版本兼容性,坚持用 E_ALL 更稳妥。
保存后无需重启系统服务,但必须终止当前 FrankenPHP 进程(Command+C),再重新运行 frankenphp serve。
验证错误是否真正可见
第一步:在 public/index.php 开头插入一行触发错误的代码:asdf(); // 故意写一个不存在的函数
第二步:刷新网页,观察是否出现红色堆栈信息。如果仍是空白页或纯 500 响应体,说明 display_errors 仍未生效——大概率是 php.ini 路径错误,或被其他 .ini 文件(如 conf.d/zz-custom.ini)中的 display_errors = Off 覆盖。
第三步:临时在 public/index.php 顶部加两行强制覆盖(仅用于验证):
ini_set('display_errors', '1');
error_reporting(E_ALL);
?>
若此时错误可见,证明问题出在 php.ini 加载链上,而非 FrankenPHP 本身。
关闭调试输出(上线前必做)
方法一:恢复 php.ini 中的 display_errors = Off 和 display_startup_errors = Off,error_reporting 改为 E_ALL & ~E_DEPRECATED & ~E_STRICT
方法二:启动 FrankenPHP 时不加 --debug 参数,并确保环境变量 FRANKENPHP_DEBUG 未设为 1
方法三:检查 Caddyfile 中是否启用了 admin 或 metrics 指令——这些端点虽不输出 PHP 错误,但在 macOS 上若绑定到 0.0.0.0:2019,会暴露进程状态,构成调试面泄露风险,应注释掉或限定为 127.0.0.1



















