對於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 = /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. ?>
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程序发送的定制消息,如下所示:
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的解析工具来查看和分析日志。但如果你的网站在共享服务器的虚拟主机中运行,就只有使用单独的文本文件记录错误日志了。
以上是php查錯的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!