在之前的文章中給大家帶來了《帶你一起了解PHP的錯誤類型和錯誤級別》,其中詳細介紹了PHP中的錯誤類型和錯誤級別,本篇文章我們一起來看一下PHP中錯誤日志的配置和使用方法。希望對大家有幫助!
在我們之前的文章中,我們介紹了PHP錯誤的異常處理、錯誤類型還有錯誤級別,接下來我們來介紹一下PHP中錯誤日志的配置和使用方法。對于 PHP 開發者來說,一旦某個項目投入使用,應該立即將配置文件 php.ini 中的 display_errors
選項關閉,以免因為這些錯誤而透露路徑、數據庫連接、數據表等信息。
再投入使用的任何一個項目中,不可避免的會有錯誤的出現,有些錯誤報告對開發者是有用的,這時候我們可以通過單獨的文本文件來進行錯誤報告的日志記錄。這樣的話,開發人員可以更輕松的進行查看系統是否存在問題。將PHP配置文件中的 log_errors
開啟的話,就可以將程序中的錯誤報告寫進錯誤日志中了。
其中這份錯誤報告會自動記錄到服務器的日志文件中,想要發送到系統的syslog
中,也就是系統日志中,也是可以的。接下來我們就一起來看一下怎樣去實現這樣錯誤處理的方法吧。
通過指定文件記錄錯誤報告
想要實現使用目標文件來記錄錯誤報告日志,其中重要的是需要讓這個制定的文件的位置在文檔根目錄外面,這樣的話受到攻擊的可能性較低,而且這個指定文件需要擁有一定的權限,首先我們先來看一下我們需要針對php.ini
的配置指令做出怎樣的修改:
-
log_errors = On
;決定日志語句記錄的位置 -
log_errors_max_len = 1024
;設置每個日志項的最大長度 -
error_reporting = E_ALL
;將會向PHP報告發生的每個錯誤 -
display_errors = Off
;不顯示滿足上條 指令所定義規則的所有錯誤報告 -
error_log = /usr/local/error.log
;指定產生的 錯誤報告寫入的日志文件位置
按照上述的方式修改php.ini文件后,成功設置之后,在運行PHP的腳本文件的時候,就不會在瀏覽器中有顯示錯誤報告了,這時候錯誤報告就都顯示在這個我們設置的目標文件中,也就是錯誤日志中了。
另外還需要注意的是,這個目標文件中可以記錄error_reporting
定義的錯誤也可以通過 error_log()
函數將錯誤信息放到服務器中的錯誤日志或者這個目標文件中。
error_log()
函數的語法格式如下:
error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ) : bool
其中需要注意的是:
$message
表示需要記錄的錯誤信息;$destination
表示目標,也就是錯誤消息被發送到的目的地。它的含義描述于以上,由 $message_type
參數所決定;$extra_headers
表示額外的頭。當 $message_type
設置為 1 的時候使用。 該信息類型使用了 mail() 的同一個內置函數。
$message_type表示
設置錯誤應該發送到何處??赡艿男畔㈩愋陀幸韵聨讉€:
-
0
:(默認值)將$message
發送到 PHP 的系統日志,使用操作系統的日志機制或者一個文件,取決于配置文件中 error_log 設置了什么; -
1
:將$message
發送到參數 $destination 設置的郵件地址。 第四個參數 $extra_headers 只有在這個類型里才會被用到;(2已經被棄用了) -
3
:$message
被發送到位置為 $destination 的文件里。字符 $message 不會默認被當做新的一行; -
4
:將$message
直接發送到 SAPI 的日志處理程序中。
接下來我們通過示例看一下以登入 Mysql 數據庫為例,當登入失敗時記錄錯誤信息。示例如下:
<?php $link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db"); if (!$link) { error_log('Mysql 數據庫連接失?。?#39;,0); exit(); } ?>
如果以登入Oracle數據庫出現問題的處理為例,該函數的使用示例如下:
<?php if(!Ora_Logon($username, $password)){ error_log("Oracle數據庫不可用!", 0); //將錯誤消息寫入到操作系統日志中 } if(!($foo=allocate_new_foo()){ error_log("不行!", 1, ". mydomain.com"); //發送到管理員郵箱中 } error_log("不行!", 2, "localhost:5000"); //發送到本機對應5000端口的服務器中 error_log("不行!", 3, "/usr/local/errors.log"); //發送到指定的文件中 ?>
代碼運行之后就會在php.ini 配置文件中 error_log
一項所設置的目錄中生成對應的錯誤日志文件。接下來我們看一下錯誤信息記錄到操作系統的日志里是什么情況。
通過系統日志記錄錯誤報告
上文中我們講到了將使用目標文件來記錄錯誤報告日志,接下來我們就來看一下將錯誤信息放到操作系統的日志里面,這是可以實現的,其中不同的操作系統,它們的日志管理也是不一樣的,下面我們都是使用常見的windows舉例,Windows 上錯誤將發送到事件日志里,可以通過事件查看器來查看。
通過什么樣的方法才能夠在操作系統的日志里有錯誤信息呢?這時候我們可以通過php.ini 配置文件中 error_log
,接下來我們看一下應該怎樣修改php.ini中的配置文件。
修改error_reporting = E_ALL
用來報告所發生的每個錯誤;修改display_errors = Off
用來不顯示滿足上條指令所定義規則的所有錯誤報告;修改log_errors = On
用于決定日志語句記錄的位置;修改log_errors_max_len = 1024
用于設置每個日志項的最大長度;修改error_log = syslog
用于指定產生的錯誤報告寫入操作系統的日志里 。
雖然通過前面介紹的 error_log()
函數,可以向 syslog 中發送定制的消息,想要實現將錯誤信息放到操作系統的日志里面,我們還需要三個函數的幫助,下面我們就來簡單的介紹一下:
-
openlog()
函數
該函數是用來打開連接的,用于向系統中寫入日志信息做的準備。并且每個日志的消息中都有它的一個參數是字符串形式的。
-
syslog()
函數
該函數擁有兩個參數,它的作用是用來給系統中的日志給一個特定消息,第一個參數就是用來設置這個消息的優先級,第二個參數即使提供字符串,這個字符串就是這個特定的消息。
-
closelog()
函數
該函數就是用來關閉連接的,這個連接就是上文中openlog()
函數打開的。
那么接下來我們通過示例來看一下實際操作吧,示例如下:
<?php openlog("PHP中文網", LOG_PID, LOG_USER); syslog(LOG_WARNING, "向 syslog 中發送定時消息,發送時間:".date("Y/m/d H:i:s")); closelog(); ?>
以windows系統為例,打開“此電腦”右鍵選擇“管理”選項,進入計算機管理界面,找到圖示中應用程序的選項,就能夠看到我們自己定制的警告信息了。如下所示:
其中我們需要注意的是:
你所使用的Web服務器環境決定了是使用指定文件還是使用syslog記錄錯誤日志。可以控制服務器的話就可以利用解析工具來查看和分析日志,推薦使用syslog 激勵錯誤日志,網站在共享服務器的虛擬主機中運行,推薦使用單獨的文本文件記錄錯誤日志了。
大家如果感興趣的話,可以點擊《PHP視頻教程》進行