首頁 後端開發 php教程 php 的全域錯誤處理詳解

php 的全域錯誤處理詳解

Jul 07, 2017 am 10:22 AM
php 處理 詳解

php自有try{throw{}}catch{}異常/錯誤捕獲系統,難以在生產環境中運用;生產環境中,我們一般要求,一旦出現異常/錯誤,php立刻結束腳本,向訪客瀏覽器輸出出錯提示,並透過自訂函數向管理員發送訊息

#本文目的

##PHP的全域錯誤處理,在開發專案的時候很有用,可以幫助開發者快速定位一些問題,提高工作效率。預設情況下,全域錯誤會直接輸出,但是最近開發時使用的一個框架庫對全域錯誤處理進行了設定,導致許多錯誤訊息沒有輸出,在定位問題上有一定的耗時。所以,研究了一下此函式庫的實現,發現它設定了

error_reportingset_error_handler,導致此現象。現在記錄這兩個函數的用法,作為備忘錄。

背景

PHP沒有類型偵測,開發人員比較容易輸入錯誤單字,造成致命錯誤,最終導致腳本停止執行。如果這個時候,沒有得到任何錯誤訊息,那麼會是一件很痛苦的事情。你必須從腳本的第一行程式碼開始調試,在成千上萬行的程式碼中不斷的print或echo,直到你定位到這個輸錯的單字。然後,有不得不原路返回,將先前新增的print或echo全部刪除。這時一件及其枯燥乏味的工作。

一般情況

正常情況下,php會將致命錯誤直接輸出,會將錯誤的出處(檔案位址,行號)和原因等輸出,這樣,開發著可以很方便的定位到問題。

但是有些時候,可能由於php.ini的設定問題,可能是第三方框架配置的問題,導致這些資訊沒有輸出,那麼此時,必須學會自己設定相關參數,輸出這些錯誤訊息,幫助快速定位問題。

error_reporting

error_reporting是一個php的全域設定參數,在php.ini。用於配置錯誤輸出級別,參數是位元位,可以用來設定錯誤輸出的級別,下面是從php.ini中copy出來的資訊:

; error_reporting is a bit-field. Or each number up to get desired error
; reporting level
; E_ALL - All errors and warnings (doesn't include E_STRICT)
; E_ERROR - fatal run-time errors
; E_RECOVERABLE_ERROR - almost fatal run-time errors
; E_WARNING - run-time warnings (non-fatal errors)
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
; relying on the fact it's automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
; and forward compatibility of your code
; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
; initial startup
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
;
; Examples:
;
; - Show all errors, except for notices and coding standards warnings
;
;error_reporting = E_ALL & ~E_NOTICE
;
; - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
;
; - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
;
; - Show all errors except for notices and coding standards warnings
;
error_reporting = E_ALL & ~E_NOTICE
登入後複製


默認情況下,php會輸出所有錯誤訊息,除了notice。同樣,php標準函數中提供了名稱相同的函數error_reporting(int $level),用於在php腳本中,完成相同的功能。這樣將不會影響其他程序。值得注意的是,$level為0的時候是關閉錯誤輸出,也就是任何錯誤都不會輸出。

set_error_handler

php的預設錯誤處理是將訊息輸出。但是,有時候需要定義一些其他操作,這時就需要自訂錯誤處理函數。 php提供內建函數set_error_handler可以幫助我們註冊自己的錯誤處理函數。函數原型如下:

mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )

#值得注意的是,即使註冊了錯誤處理函數,預設的行為仍然會執行,也就是錯誤出現時,仍然會輸出錯誤訊息,所以需要在程式中顯示的將錯誤等級設為0,然後在註冊自己的錯誤處理函數。這種方式,在生產環境下,尤其重要,因為即時出錯,敏感內部錯誤訊息也不會暴露給潛在的惡意使用者。還有很重要的一點要指出,自訂錯誤處理函數不能處理fatal error(例如編譯錯誤)。以下是使用自訂錯誤處理函數的列子:

<?php
error_reporting (0);
function error_handler ($error_level, $error_message, $file, $line) {
  $EXIT = FALSE;
  switch ($error_level) {
    case E_NOTICE:
    case E_USER_NOTICE:
      $error_type = &#39;Notice&#39;;
      break;
    case E_WARNING:
    case E_USER_WARNING:
      $error_type = &#39;Warning&#39;;
      break;
    case E_ERROR:
    case E_USER_ERROR:
      $error_type = &#39;Fatal Error&#39;;
      $EXIT = TRUE;
      break;
    default:
      $error_type = &#39;Unknown&#39;;
      $EXIT = TRUE;
      break;
  }
  printf ("%s: %s in %s on line %d\n", $error_type, $error_message, $file, $line);
 
  if ($EXIT) {
    die();
  }
}
set_error_handler (&#39;error_handler&#39;);
 
//new NonExist();
echo $novar;
echo 3/0;
trigger_error (&#39;Trigger a fatal error&#39;, E_USER_ERROR);
new NonExist();
?>
登入後複製

執行此腳本可以得到下面的輸出:

Notice: Undefined variable: novar in /your/php_demo_file.php on line 40

Warning: pision by zero in /your/php_demo_file.php on line 41

Fatal Error: Trigger a fatal error in /your/php_demo_file.php on line 42
登入後複製

可以看到,最後的「new NoExistClass()」的例外,沒有被自訂的錯誤處理函數捕獲。

最後,捎帶提一下,

set_exception_handler註冊頂層的例外處理,在web一用中,可以設定一下,然後統一的跳到錯誤處理頁面。

以上是php 的全域錯誤處理詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

See all articles