在 set_error_handler 的註解中,有一種技術描述了如何在顯示給使用者之前捕獲所有錯誤(甚至是解析錯誤),使用特殊的錯誤處理程式和輸出處理程式。如果此輸出處理程式偵測到輸出緩衝區中存在嚴重錯誤,則會在顯示給使用者之前捕獲並處理它。如果未偵測到錯誤,則會逐字顯示輸出緩衝區(即不壓縮)。
如果您正在使用此方法,您仍然可以利用 ob_gzhandler 的壓縮功能。但是,您必須指定一個 mode 引數(我正在 RedHat9 上使用 4.2.2)。mode 值會影響自動新增的標頭(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);
}
}
?>