PHP Conference Japan 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

设置错误报告级别。参数可以是表示位字段的整数,也可以是命名常量。error_reporting 级别和常量在 预定义常量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 外部(例如在 httpd.conf 中)使用 PHP 常量将没有任何有意义的作用,因此在这种情况下需要使用 int 值。并且由于错误级别会随着时间的推移而增加,因此最大值(对于 E_ALL)可能会发生变化。因此,在 E_ALL 的位置,请考虑使用更大的值来覆盖从现在到未来的所有位字段,例如 2147483647(包含所有错误,而不仅仅是 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

如果此参数设置为 On(默认值),则此参数将显示 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 布尔型

如果启用,则关闭正常的错误报告并将错误格式化为 XML-RPC 错误消息。

xmlrpc_error_number 整型

用作 XML-RPC faultCode 元素的值。

docref_root 字符串

新的错误格式包含对描述错误或导致错误的函数的页面的引用。对于手册页,您可以下载您语言版本的手册,并将此 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 字符串

参见 docref_root

注意:

docref_ext 的值必须以点 "." 开头。

error_prepend_string 字符串

在错误消息之前输出的字符串。仅在错误消息显示在屏幕上时使用。主要目的是能够在错误消息之前添加额外的 HTML 标记。

error_append_string 字符串

在错误消息之后输出的字符串。仅在错误消息显示在屏幕上时使用。主要目的是能够在错误消息之后添加额外的 HTML 标记。

error_log 字符串

脚本错误应记录到的文件的名称。该文件应可由 Web 服务器的用户写入。如果使用特殊值 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 字符串

指定附加到每条消息的标识字符串。仅当 error_log 设置为“syslog”时有效。

添加注释

用户贡献的注释 2 个注释

cjakeman at bcs dot org
15 年前
使用
<?php ini_set('display_errors', 1); ?>
在脚本顶部将无法捕获任何解析错误。缺少 ")" 或 ";" 仍会导致空白页面。

这是因为整个脚本在执行之前就被解析了。如果您无法更改 php.ini 并设置

display_errors 开启

那么在 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 设置为您期望的文件以记录错误而不是 display_errors(这需要打开 log_errors)。
ohcc at 163 dot com
7 年前
如果将 error_log 指令设置为相对路径,则它是相对于文档根目录而不是 php 的包含文件夹的路径。
To Top