2

我知道比忽略錯誤更好,我保證。運行XML-Sitemaps生成器會在沒有有效會話信息的情況下擊中URL,以取悅CodeIgniter。結果是每個抓取的頁面都有一個E_NOTICE,並且有一個日誌(和電子郵件通知)讓我變得瘋狂。沒有什麼能夠打破,沒有人或機器人受到傷害 - 只有我的理智受到影響。爲什麼@運營商不會在CodeIgniter中禁止E_NOTICE?

的幾名技術人員已經設計了CodeIgniter的反序列化修復()失敗:

我和每個前提,而仍運行獲得數以百計的以下通知:

NOTICE: unserialize() [<a href='function.unserialize'>function.unserialize</a>]: Error at offset 98 of 128 bytes 

這讓我回到原點,帶着一個非常簡單的問題。以下是CI Session.php的問題行724:

$data = @unserialize(strip_slashes($data)); 

我沒有添加抑制性的'@' - 它已經在那裏了。這並不意味着如果拋出E_NOTICE消息,它會特別抑制嗎?如果不是,那麼這條線怎麼可能產生所有這些讓我想把我所有的頭髮都撕掉的通知?

回答

5

設置自定義錯誤處理程序繞過PHP的錯誤處理 - 顯然PHP的錯誤抑制:

重要的是要記住的是,標準的PHP錯誤處理程序是完全繞過通過error_types除非回調指定的錯誤類型是非常重要的函數返回FALSE。 error_reporting()設置將不起作用,並且您的錯誤處理程序將被調用,但是您仍然可以讀取error_reporting的當前值並適當地執行操作。特別值得注意的是,如果導致錯誤的語句由@ error-control操作符預置,則此值將爲0。

<?php 
set_error_handler(function ($errno, $errstr) { 
    echo $errstr; 
}, E_ALL); 
@unserialize("foo"); // Still shows $errstr! 

這將接管PHP,而且很可能忽略你的錯誤抑制設置。 CodeIgniter有可能使用自己的錯誤處理程序(我相信它有這個錯誤處理程序),並且無論錯誤抑制級別如何,都會拋出錯誤。

但是,PHP似乎暗示檢查錯誤報告級別並查看它是否等於零會告訴您錯誤是否應該被抑制。因此,理論上,您可以編輯CodeIgniter錯誤處理程序並添加一個if (error_reporting()) { /* show error */ }

+0

真是一個輝煌的一天!感謝你使這個如此清晰 - 我終於能夠在不到五分鐘的時間內更新我的異常處理程序,並且我感到非常放心,並且受到更好的教育。乾杯。 –