PHP查錯

對於PHP開發者來講,一旦某個產品投入使用,應該當即將 display_errors選項關閉,以避免由於這些錯誤所透露的路徑、數據庫鏈接、數據表等信息而遭到黑客攻擊。可是,任何一個產品在投入使用後,都難 免會有錯誤出現,那麼如何記錄一些對開發者有用的錯誤報告呢?咱們能夠在單獨的文本文件中將錯誤報告做爲日誌記錄。錯誤日誌的記錄,能夠幫助開發人員或者 管理人員查看系統是否存在問題。 若是須要將程序中的錯誤報告寫入錯誤日誌中,只要在PHP的配置文件中,將配置指令log_errors開啓便可。錯誤 報告默認就會記錄到Web服務器的日誌文件裏,例如記錄到Apache服務器的錯誤日誌文件error.log中。固然也能夠記錄錯誤日誌到指定的文件中 或發送給系統syslog,分別介紹以下: php

一、使用指定的文件記錄錯誤報告日誌數據庫

使 用指定的文件記錄錯誤報告日誌使用指定的文件記錄錯誤報告日誌使用指定的文件記錄錯誤報告日誌 若是使用本身指定的文件記錄錯誤日誌,必定要確保將這個文 件存放在文檔根目錄以外,以減小遭到攻擊的可能。而且該文件必定要讓PHP腳本的執行用戶(Web服務器進程全部者)具備寫權限。假設在Linux操做系 統中,將/usr/local/目錄下的error.log文件做爲錯誤日誌文件,並設置Web服務器進程用戶具備寫的權限。而後在PHP的配置文件中, 將error_log指令的值設置爲這個錯誤日誌文件的絕對路徑。瀏覽器

 

須要將php.ini中的配置指令作以下修改: 服務器

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

2. display_errors = Off                        ;不顯示知足上條 指令所定義規則的全部錯誤報告   函數

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

4. log_errors_max_len = 1024                   ;設置每一個日誌項的最大長度   網站

5. error_log = /usr/local/error.log                ;指定產生的 錯誤報告寫入的日誌文件位置  操作系統

 

PHP 的配置文件按上面的方式設置完成之後,並從新啓動Web服務器。這樣,在執行PHP的任何腳本文件時,所產生的全部錯誤報告都不會在瀏覽器中顯示,而會記 錄在本身指定的錯誤日誌/usr/local/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數據庫出現問題的處理爲例,該函數的使用以下所示: 

1. <?php      

2.     if(!Ora_Logon($username, $password)){     

 3.         error_log("Oracle數據庫不可用!", 0);        //將錯誤消息寫入到操做系統日誌中   

4.     }   

5.     if(!($foo=allocate_new_foo()){   

6.         error_log("出現大麻煩了!", 1, ". mydomain.com");   //發送到管理員郵箱中   

7.     }  

8.     error_log("搞砸了!",   2,   "localhost:5000");     //發送到本機對應5000端口的服務器中   

9.     error_log("搞砸了!",   3,   "/usr/local/errors.log");  //發送到指定的文件中   

10. ?>  

 

二、 錯誤信息記錄到操做系統的日誌裏

錯 誤信息記錄到操做系統的日誌裏錯誤信息記錄到操做系統的日誌裏錯誤信息記錄到操做系統的日誌裏 錯誤報告也能夠被記錄到操做系統日誌裏,但不一樣的操做系統 之間的日誌管理有點區別。在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程序發送的定製消息,以下所示: 

1.  

2.     define_syslog_variables();   

3.     openlog("PHP5", LOG_PID , LOG_USER);   

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

5.     closelog();   

6. ?> 

 以Windows系統爲例,經過右擊"個人電腦"選擇管理選項,而後到系統工具菜單中,選擇事件查看器,再找到應用程序選項,就能夠看到咱們本身定製的警告消息了。上面這段代碼將在系統的syslog文件中,生成相似下面的一條信息,是事件的一部分: 

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

使 用指定的文件仍是使用syslog記錄錯誤日誌,取決於你所在的Web服務器環境。若是你能夠控制Web服務器,使用syslog是最理想的,由於你能利 用syslog的解析工具來查看和分析日誌。但若是你的網站在共享服務器的虛擬主機中運行,就只有使用單獨的文本文件記錄錯誤日誌了。

相關文章
相關標籤/搜索