PHP錯誤記錄檔的使用及匯總

來源:互聯網
上載者:User


對於PHP開發人員來說,一旦某個產品投入使用,應該立即將display_errors選項關閉,以免因為這些錯誤所透露的路徑、資料庫連接、資料表等資訊而遭到駭客攻擊。但是,任何一個產品在投入使用後,都難免會有錯誤出現,那麼如何記錄一些對開發人員有用的錯誤報表呢?

我們可以在單獨的文字檔中將錯誤報表作為日誌記錄。錯誤記錄檔的記錄,可以協助開發人員或者 管理員查看系統是否存在問題。

如果需要將程式中的錯誤報表寫入錯誤記錄檔中,只要在PHP的設定檔中,將配置指令log_errors開啟即可。錯誤報表預設就會記錄到Web伺服器的記錄檔裡,例如記錄到Apache伺服器的錯誤記錄檔檔案error.log中。當然也可以記錄錯誤記錄檔到指定的檔案中 或發送給系統syslog,分別介紹如下:

1、使用指定的檔案記錄錯誤報表日誌

如果使用自己指定的檔案記錄錯誤記錄檔,一定要確保將這個檔案存放在主目錄之外,以減少遭到攻擊的可能。並且該檔案一定要讓PHP指令碼的執行使用者(Web伺服器處理序所有者)具有寫入權限。

假設在Linux作業系統中,將/usr/local/目錄下的error.log檔案作為錯誤記錄檔檔案,並設定Web伺服器處理序使用者具有寫的許可權。然後在PHP的設定檔中, 將error_log指令的值設定為這個錯誤記錄檔檔案的絕對路徑。

此時需要將php.ini中的配置指令做如下修改:

1. error_reporting  =  E_ALL               ;將會向PHP報告發生的每個錯誤  

2. display_errors = Off                    ;不顯示滿足上條 指令所定義規則的所有錯誤報表  

3. log_errors = On                         ;決定日誌語句記錄的位置  

4. log_errors_max_len = 1024               ;設定每個日誌項的最大長度  

5. error_log = /www/phpernote/error.log    ;指定產生的 錯誤報表寫入的記錄檔位置 

PHP的設定檔按上面的方式設定完成以後,並重新啟動Web伺服器。這樣,在執行PHP的任何指令檔時,所產生的所有錯誤報表都不會在瀏覽器中顯示,而會記錄在自己指定的錯誤記錄檔/www/phpernote/error.log檔案中。

此外,不僅可以記錄滿足error_reporting所定義規則的所有錯誤,而且還可以使用PHP中的error_log()函數,送出一個使用者自訂的錯誤資訊。該函數的原型如下所示:

1. bool error_log ( string message [, int message_type  [, string destination [, string extra_headers]]] ) 

此函數會送出錯誤資訊到Web伺服器的錯誤記錄檔檔案、某個TCP伺服器或到指定檔案中。該函數執行成功則返回TRUE,失敗則返回FALSE。

第一個參數 message 是必選項,即為要送出的錯誤資訊。如果僅使用這一個參數,會按設定檔php.ini中所設定的位置處發送訊息。

第二個參數 message_type為整數值:0表示送到作業系統的日誌中;1則使用PHP的Mail()函數,發送資訊到某E-mail處。

第四個參數extra_headers亦會用到;2則將錯誤資訊送到TCP伺服器中,此時第三個參數destination表示目的地IP及Port;3則將資訊存到檔案destination中。

如果以登入Oracle資料庫出現問題的處理為例,該函數的使用如下所示:

if(!Ora_Logon($username, $password)){    
    error_log("Oracle資料庫不可用!", 0);        //將錯誤訊息寫入到作業系統日誌中  
}
if(!($foo=allocate_new_foo()){  
    error_log("出現大麻煩了!", 1, ". 111cn.net");   //發送到管理員郵箱中  
}
error_log("搞砸了!",2,"localhost:5000");     //發送到本機對應5000連接埠的伺服器中
error_log("搞砸了!",3,"/usr/local/errors.log");  //發送到指定的檔案中


2、 錯誤資訊記錄到作業系統的日誌裡

錯誤報表也可以被記錄到作業系統日誌裡,但不同的作業系統之間的日誌管理有點區別。在Linux上錯誤語句將送往syslog,而在Windows上錯誤將發送到事件記錄裡。如果你不熟悉syslog,起碼要知道它是基於UNIX的日誌工具,它提供了一個API來記錄與系統和應用程式執行有關的訊息。

Windows事件記錄實際上與UNIX的syslog相同,這些日誌通常可以通過事件檢視器來查看。如果希望將錯誤報表寫到作業系統的日誌裡,可以在設定檔中將error_log指令的值設定為syslog。

具體需要在php.ini中修改的配置指令如下所示:

1. error_reporting  =  E_ALL                   ;將會向PHP報告發生的每個錯誤  

2. display_errors = Off                        ;不顯示 滿足上條指令所定義規則的所有錯誤報表  

3. log_errors = On                             ;決定日誌語句記錄的位置  

4. log_errors_max_len = 1024                   ;設定每個日誌項的最大長度  

5. error_log = syslog                          ;指定產生的錯誤報表寫入作業系統的日誌裡 

除了一般的錯誤輸出之外,PHP還允許向系統syslog中發送定製的訊息。雖然通過前面介紹的error_log()函數,也可以向syslog中發送定製的訊息,但在PHP中為這個特性提供了需要一起使用的4個專用函數。

分別介紹如下:

define_syslog_variables()

在使用openlog()、syslog及closelog()三個函數之前必須先調用該函數。因為在調用該函數時,它會根據現在的系統內容為下面三個函數初使用化一些必需的常量。

openlog()

開啟一個和當前系統中日誌器的串連,為向系統插入日誌訊息做好準備。並將提供的第一個字串參數插入到每個日誌訊息中,該函數還需要指定兩個將在日誌上下文使用的參數,可以參考官方文檔使用。

 syslog()

該函數向系統日誌中發送一個定製訊息。需要兩個必選參數,第一個參數通過指定一個常量定製訊息的優先順序。例如LOG_WARNING表示一般的警告,LOG_EMERG表示嚴重地可以預示著系統崩潰的問題,一些其他的表示嚴重程度的常量可以參考官方文檔使用。第二個參數則是向系統日誌中發送的定製 訊息,需要提供一個訊息字串,也可以是PHP引擎在運行時提供的錯誤字串。

closelog()

該函數在向系統日誌中發送完成定製訊息以後調用,關閉由openlog()函數開啟的日誌串連。

如果在設定檔中,已經開啟向syslog發送定製訊息的指令,就可以使用前面介紹的四個函數發送一個警告訊息到系統日誌中,並通過系統中的syslog解析工具,查看和分析由PHP程式發送的定製訊息,如下所示:


define_syslog_variables(); 

openlog("PHP5", LOG_PID , LOG_USER); 

syslog(LOG_WARNING, "警告報告向syslog中發送的示範, 警告時間:".date("Y/m/d H:i:s"));

closelog();

以Windows系統為例,通過右擊"我的電腦"選擇管理選項,然後到系統工具菜單中,選擇事件檢視器,再找到應用程式選項,就可以看到我們自己定製的警告訊息了。上面這段代碼將在系統的syslog檔案中,產生類似下面的一條資訊,是事件的一部分:

1. PHP5[3084], 警告報告向syslog中發送的示範, 警告時間:2009/03/26 04:09:11. 

使用指定的檔案還是使用syslog記錄錯誤記錄檔,取決於你所在的Web伺服器環境。如果你可以控制Web伺服器,使用syslog是最理想的,因為你能利用syslog的解析工具來查看和分析日誌。但如果你的網站在共用伺服器的虛擬機器主機中運行,就只有使用單獨的文字檔記錄錯誤記錄檔了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.