register_shutdown_function 是 PHP 脚本结束时触发回调的机制,支持函数名、匿名函数或对象方法注册,配合 error_get_last() 可捕获致命错误,按逆序执行多级回调并支持参数传递。

register_shutdown_function 是 PHP 中用于在脚本执行结束(正常结束、出错终止或调用 exit/die)时触发回调函数的机制,常用于资源清理、日志记录、错误兜底处理等场景。
基本用法:注册一个结束时执行的函数
直接传入函数名(字符串)、匿名函数或数组形式的 [对象, 方法] 即可:
- 使用普通函数名:
register_shutdown_function('my_cleanup'); - 使用匿名函数(推荐,避免全局污染):
register_shutdown_function(function () { echo "脚本结束了\n"; }); - 使用对象方法:
register_shutdown_function([$obj, 'onShutdown']);
捕获脚本异常退出的关键:配合 error_get_last()
脚本因致命错误(如 Parse Error、Fatal Error)而中断时,不会进入常规错误处理流程,但 shutdown 函数仍会执行。此时可调用 error_get_last() 检查是否发生了未捕获的致命错误:
-
$error = error_get_last();返回 null 表示无错误,否则返回包含 type、message、file、line 的数组 - 常见 type 值:
E_ERROR、E_PARSE、E_CORE_ERROR等 - 示例逻辑:
if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR])) { log_error($error); }
注意点:执行时机与限制
shutdown 函数在以下情况均会执行,但有明确边界:
立即学习“PHP免费学习笔记(深入)”;
- 脚本自然运行到底部、遇到
exit()或die()、发生致命错误后 - 它不捕获
fastcgi_finish_request()后的阶段(如 Nginx 已返回响应,但 PHP 还在后台跑) - 不能在 shutdown 函数中再调用
register_shutdown_function(无效) - 输出可能被忽略(尤其在 CLI 或已发送 HTTP 头后),建议用
error_log()记录而非 echo/print
实用小技巧:多级注册与参数传递
可以多次调用该函数注册多个回调,它们按注册顺序逆序执行(后注册的先执行),适合分层清理:
- 先注册 DB 连接关闭,再注册日志 flush,最后注册监控上报
- 支持向回调传参:
register_shutdown_function('log_shutdown', 'api_v2', $request_id); - 参数会原样传递给函数,无需 global 或闭包捕获(更清晰安全)



















