PHP 日本研討會 2024

執行期設定

這些函數的行為會受到 php.ini 中的設定影響。

錯誤與記錄設定選項
名稱 預設值 可變更 變更日誌
error_reporting NULL INI_ALL  
display_errors "1" INI_ALL  
display_startup_errors "1" INI_ALL 在 PHP 8.0.0 之前,預設值為 "0"
log_errors "0" INI_ALL  
log_errors_max_len "1024" INI_ALL 在 PHP 8.0.0 起無效,在 PHP 8.1.0 起已移除。
ignore_repeated_errors "0" INI_ALL  
ignore_repeated_source "0" INI_ALL  
report_memleaks "1" INI_ALL  
track_errors "0" INI_ALL 在 PHP 7.2.0 起已棄用,在 PHP 8.0.0 起已移除。
html_errors "1" INI_ALL  
xmlrpc_errors "0" INI_SYSTEM  
xmlrpc_error_number "0" INI_ALL  
docref_root "" INI_ALL  
docref_ext "" INI_ALL  
error_prepend_string NULL INI_ALL  
error_append_string NULL INI_ALL  
error_log NULL INI_ALL  
error_log_mode 0o644 INI_ALL PHP 8.2.0 起可用
syslog.facility "LOG_USER" INI_SYSTEM PHP 7.3.0 起可用。
syslog.filter "no-ctrl" INI_ALL PHP 7.3.0 起可用。
syslog.ident "php" INI_SYSTEM PHP 7.3.0 起可用。
關於 INI_* 模式的更多細節與定義,請參閱設定檔設定的來源

以下為設定指令的簡短說明。

error_reporting int

設定錯誤回報層級。參數可以是表示位元欄位的整數,或是已命名的常數。錯誤回報層級與常數描述於預定義常數,以及在 php.ini 中。若要在執行期設定,請使用 error_reporting() 函數。另請參閱 display_errors 指令。

預設值為 E_ALL

在 PHP 8.0.0 之前,預設值為:E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED。這表示不會顯示層級為 E_NOTICEE_STRICTE_DEPRECATED 的診斷訊息。

注意PHP 常數在 PHP 之外

在 PHP 之外使用 PHP 常數,例如在 httpd.conf 中,將不會有任何有意義的效果,因此在這種情況下需要 int 值。而且由於錯誤層級會隨著時間新增,最大值(對於 E_ALL)可能會變更。因此,請考慮使用較大的值來涵蓋從現在到未來的所有位元欄位,例如 2147483647 的數值(包含所有錯誤,而不僅是 E_ALL)來取代 E_ALL

display_errors string

這決定是否應將錯誤列印到螢幕上作為輸出的一部分,還是應向使用者隱藏錯誤。

"stderr" 會將錯誤傳送到 stderr 而不是 stdout

注意:

這是一項支援您開發的功能,絕不應在生產系統上使用(例如,連線至網際網路的系統)。

注意:

雖然 display_errors 可以在執行期設定(使用 ini_set()),但如果腳本有嚴重錯誤,則不會有任何效果。這是因為所需的執行期動作不會被執行。

display_startup_errors bool

即使已開啟 display_errors,在 PHP 啟動順序期間發生的錯誤也不會顯示。強烈建議關閉 display_startup_errors,除非用於偵錯。

log_errors bool

告知是否應將腳本錯誤訊息記錄到伺服器的錯誤記錄檔或 error_log。因此,此選項是伺服器特定的。

注意:

強烈建議您在生產網站上使用錯誤記錄,而不是顯示錯誤。

log_errors_max_len int

設定 log_errors 的最大長度(以位元組為單位)。在 error_log 中,會加入關於來源的資訊。預設值為 1024,而 0 則允許不套用任何最大長度。此長度會套用至記錄的錯誤、顯示的錯誤,以及 $php_errormsg,但不會套用至明確呼叫的函數,例如 error_log()

當使用 int 時,該值會以位元組為單位測量。也可以使用這個常見問題中描述的縮寫符號。
ignore_repeated_errors bool

不要記錄重複訊息。除非 ignore_repeated_source 設定為 true,否則重複錯誤必須發生在同一個檔案的同一行上。

ignore_repeated_source bool

忽略重複訊息時的訊息來源。當此設定為開啟時,您將不會記錄來自不同檔案或原始碼行的重複訊息錯誤。

report_memleaks bool

如果此參數設定為開啟(預設值),此參數將會顯示 Zend 記憶體管理員偵測到的記憶體洩漏報告。此報告將會傳送至 Posix 平台上的 stderr。在 Windows 上,它將使用 OutputDebugString() 傳送至偵錯工具,並且可以使用如» DbgView之類的工具檢視。此參數僅在偵錯組建中有效,並且 error_reporting 必須在允許列表中包含 E_WARNING

track_errors bool

如果啟用,最後的錯誤訊息將會始終存在於變數 $php_errormsg 中。

html_errors bool

如果啟用,錯誤訊息將會包含 HTML 標籤。HTML 錯誤的格式會產生可點擊的訊息,將使用者導向至描述錯誤或造成錯誤的函數的頁面。這些參考會受到 docref_rootdocref_ext 的影響。

如果停用,錯誤訊息將僅為純文字。

xmlrpc_errors bool

如果啟用,將會關閉正常的錯誤回報,並將錯誤格式化為 XML-RPC 錯誤訊息。

xmlrpc_error_number int

用作 XML-RPC faultCode 元素的值。

docref_root string

新的錯誤格式包含對描述錯誤或造成錯誤之函數的頁面的參考。在手冊頁面的情況下,您可以下載您的語言手冊,並將此 ini 指令設定為您本機複本的 URL。如果您的本機手冊複本可以透過 "/manual/" 存取,您可以簡單地使用 docref_root=/manual/。此外,您必須設定 docref_ext 以符合您複本的副檔名 docref_ext=.html。可以使用外部參考。例如,您可以使用 docref_root=http://manual/en/docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon &url=http%3A%2F%2Fwww.php.net%2F"

大多數情況下,您希望 docref_root 值以斜線 "/" 結尾。但是請參閱上面的第二個範例,其中沒有也不需要。

注意:

這是一項支援您開發的功能,因為它可以讓您輕鬆查詢函數描述。但是,絕不應在生產系統上使用(例如,連線至網際網路的系統)。

docref_ext string

請參閱 docref_root

注意:

docref_ext 的值必須以點 "." 開頭。

error_prepend_string string

在錯誤訊息之前輸出的字串。僅在錯誤訊息顯示在螢幕上時使用。主要目的是能夠將額外的 HTML 標記附加到錯誤訊息之前。

error_append_string string

在錯誤訊息後輸出的字串。僅在螢幕上顯示錯誤訊息時使用。主要目的是能夠在錯誤訊息後附加額外的 HTML 標記。

error_log 字串

應記錄腳本錯誤的檔案名稱。該檔案應可由網頁伺服器的使用者寫入。如果使用特殊值 syslog,則錯誤會改為傳送到系統記錄器。在 Unix 上,這表示 syslog(3);在 Windows 上,這表示事件記錄。另請參閱:syslog()。如果未設定此指令,則錯誤會傳送到 SAPI 錯誤記錄器。例如,在 Apache 中是錯誤記錄,在 CLI 中則是 stderr。另請參閱 error_log()

error_log_mode 整數

error_log 中設定的檔案模式。

syslog.facility 字串

指定哪個類型的程式正在記錄訊息。僅在 error_log 設定為 "syslog" 時有效。

syslog.filter 字串

指定篩選記錄訊息的篩選器類型。允許的字元將不經修改傳遞;所有其他字元都將以十六進位表示法寫入,並加上 \x 前綴。

  • all – 記錄的字串將在新行字元處分割,所有字元將不經修改傳遞
  • ascii – 記錄的字串將在新行字元處分割,並且任何不可列印的 7 位元 ASCII 字元都將被跳脫
  • no-ctrl – 記錄的字串將在新行字元處分割,並且任何不可列印的字元都將被跳脫
  • raw – 所有字元將不經修改地傳遞到系統記錄器,而不會在新行處分割(與 PHP 7.3 之前相同)
此設定會影響透過將 error_log 設定為 "syslog" 和呼叫 syslog() 進行的記錄。

注意:

raw 篩選器類型從 PHP 7.3.8 和 PHP 7.4.0 開始提供。

Windows 不支援此指令。
syslog.ident 字串

指定附加到每條訊息的 ident 字串。僅在 error_log 設定為 "syslog" 時有效。

新增註解

使用者提供的註解 2 則註解

26
cjakeman at bcs dot org
15 年前
使用
<?php ini_set('display_errors', 1); ?>
在腳本頂部不會捕獲任何語法解析錯誤。遺漏 ")" 或 ";" 仍會導致空白頁面。

這是因為整個腳本在執行前都會先進行語法解析。如果您無法變更 php.ini 並設定

display_errors On

那麼在 error_reporting 下有一個可能的解決方案

<?php
error_reporting
(E_ALL);
ini_set("display_errors", 1);
include(
"file_with_errors.php");
?>


[由管理員修改]

您也應考慮在開發模式下於 php.ini 中設定 error_reporting = -1 和 display_errors = On,以查看所有嚴重/語法解析錯誤;或在生產環境中將 error_log 設定為您想要的檔案以記錄錯誤,而不是顯示錯誤(這需要開啟 log_errors)。
6
ohcc at 163 dot com
7 年前
如果您將 error_log 指令設定為相對路徑,則它是相對於文件根目錄的路徑,而不是 php 的包含資料夾的路徑。
To Top