PHP查錯

来源:http://www.cnblogs.com/zq-top/archive/2017/10/08/7636634.html
-Advertisement-
Play Games

對於PHP開發者來說,一旦某個產品投入使用,應該立即將 display_errors選項關閉,以免因為這些錯誤所透露的路徑、資料庫連接、數據表等信息而遭到黑客攻擊。但是,任何一個產品在投入使用後,都難 免會有錯誤出現,那麼如何記錄一些對開發者有用的錯誤報告呢?我們可以在單獨的文本文件中將錯誤報告作為 ...


對於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的解析工具來查看和分析日誌。但如果你的網站在共用伺服器的虛擬主機中運行,就只有使用單獨的文本文件記錄錯誤日誌了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!ATTLIST 元素名 屬性名稱 屬性類型 屬性特點> 1.屬性類型 屬性值引用已定義的id值,複數形式可以應用多個id, 以空格隔開 (1)CDATA e.g (2) ID類型 (3)IDREF,IDREFS (4)enumerated枚舉類型 2.屬性特點 ...
  • Almost Sorted Array Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 6019 Accepted Submission(s) ...
  • 1.元素聲明 (1)any元素類型 <!ELEMENT 元素名 ANY> (2)EMPTY元素類型 <!ELEMENT 元素名 EMPTY> 空標記,即元素中沒有內容,不能包含子元素和文本 <person name="" age="" /> (3) PCDATA類型的元素(純文本) <!ELEMEN ...
  • 這一節主要介紹List介面的幾個實現類的區別: 1.線程安全 Vector是線程安全的,而ArrayList和LinkedList是非線程安全的。從源碼中我們可知,Vector類中的方法大部分都是同步的,即被synchronized關鍵字修飾;而那些沒有被synchronized關鍵字修飾的方法都是 ...
  • Count a * b Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 872 Accepted Submission(s): 315 Pro ...
  • Travelling HDU - 3001 方法:3進位狀態壓縮dp(更好的方法是預處理出每個狀態數字對應的y數組,然後用刷表,時間複雜度可以少一個n) 曾經錯在: 1.65行,兩個min打成max 2.每一組數據沒有重置ans(浪費2小時) ...
  • java.io.File類用於表示文件(目錄) File類只用於表示文件(目錄)的信息(名稱、大小等),不能用於文件內容的訪問 RandomAccessFile java提供的對文件內容的訪問,既可以讀文件,也可以寫文件。 RandomAccessFile支持隨機訪問文件,可以訪問文件的任意位置 1 ...
  • 操作HTML標簽的時候,我們首先要找到HTML標簽的位置,然後進行操作,下麵來看看集中查找標簽的方法,如下: 1、Id選擇器 -- Id在HTML中是唯一的,通過Id進行查找,Id對應的是#號 id ==》# 上面HTML代碼,下麵使用$("#i10")進行查找,查找Id="i10"的標簽,如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...