在 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 '发生内部错误.';
} else {
return ob_gzhandler($buffer, 5);
}
}
?p>