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