在 `set_error_handler` 的说明中,描述了一种技术,可以在错误显示给用户之前捕获所有错误(甚至解析错误),方法是使用特殊的错误处理程序和输出处理程序。如果此输出处理程序检测到输出缓冲区中的致命错误,则会在其显示给用户之前捕获并处理该错误。如果未检测到错误,则按字面显示输出缓冲区(即,不进行压缩)。
如果使用此方法,仍然可以利用 `ob_gzhandler` 的压缩功能。但是,必须指定模式参数(我在 RedHat9 上使用 4.2.2)。模式值会影响自动添加的标头(Content-Encoding 等)。值为“5”对我有用。“0”或丢弃参数会在 Mozilla 下导致空白屏幕。
<?php
function my_output_handler(&$buffer) {
if(ereg("(error</b>:)(.+) in <b>(.+)</b> on line <b>(.+)</b>", $buffer, $regs)) {
my_error_handler(E_ERROR, $regs[2], $regs[3], $regs[4]);
return 'An internal error occurred.';
} else {
return ob_gzhandler($buffer, 5);
}
}
?>