Flight 的 error 回调不触发,因默认不捕获 PHP 致命错误;需在 Flight::start() 前注册回调,并配合 set_error_handler 和 register_shutdown_function 处理致命错误。
Flight 中
回调不触发?先确认是否启用了错误捕获
Flight 默认不会自动捕获 PHP 致命错误(如
),它只处理抛出的异常和手动调用的
。如果你改了
回调但 500 页面没变,大概率是错误根本没进到 Flight 的流程里。
实操建议:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
确保在
前注册了
回调,否则无效
检查
和
设置——它们会影响底层错误是否被转成异常;推荐在入口文件开头加
致命错误(Parse/Compile/Fatal)需配合
+
才能兜底,Flight 本身不接管这部分
自定义 404 响应:用
而不是
404 是路由未匹配,属于正常控制流分支,不是错误。Flight 提供专用的
回调,别往
里塞 404 逻辑,否则会干扰真实错误排查。
常见错误现象:访问不存在路径时返回空白页或默认 Apache/Nginx 404,说明
没生效。
立即学习
“
PHP免费学习笔记(深入)
”;
实操建议:
必须在
之前注册:
如果用了 URL 重写(如 Apache 的
),确保所有请求都落到
,否则 Flight 根本收不到请求
不要在
回调里 throw 新异常——这会跳转到
回调,导致 404 变成 500
返回 JSON 格式的 404/500 响应:注意
和状态码顺序
API 场景下,前端依赖正确的
和 HTTP 状态码。Flight 不会自动设置响应头,漏掉会导致前端解析失败或状态码被忽略。
实操建议:
在
或
回调开头立即调用
或
;放在
之后可能失效
手动设置头:
示例:
生产环境禁用调试信息:
关闭后仍要控制输出内容
即使
,Flight 的
回调若直接
,依然会把敏感信息(如路径、数据库配置片段)暴露给用户。
实操建议:
开发环境可保留详细错误,生产环境回调中只输出泛化提示,例如
记录完整错误到日志:
避免在回调里调用
、
或未过滤的
真正容易被忽略的是:Flight 的错误处理只是应用层一环,Web 服务器(如 Nginx)可能配置了
,会覆盖 PHP 输出。上线前务必检查服务器级错误页配置是否冲突。
errorFatal error: Call to undefined functionFlight::error()errorFlight::start()Flight::error()display_errorserror_reportingerror_reporting(E_ALL); ini_set('display_errors', '0');set_error_handlerregister_shutdown_functionnotFounderrorFlight::notFound()errornotFoundFlight::start()Flight::notFound(function() { http_response_code(404); echo '自定义404页面'; });.htaccessindex.phpnotFounderrorContent-TypeContent-Type: application/jsonnotFounderrorhttp_response_code(404)http_response_code(500)header()header('Content-Type: application/json; charset=utf-8');Flight::notFound(function() {
http_response_code(404);
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['error' => 'Not Found'], JSON_UNESCAPED_UNICODE);
});display_errorsdisplay_errors=Offerrorecho $e->getMessage()'Something went wrong.'error_log($e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine(), 3, '/var/log/flight-error.log');var_dumpprint_r$e->__toString()error_page 500 /50x.html