略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: 运行时配置

2024-11-14

运行时配置

这些函数的行为受 php.ini 中的设置影响。

错误和日志记录配置选项
名字 默认 可修改范围 更新日志
error_reporting NULL PHP_INI_ALL  
display_errors "1" PHP_INI_ALL  
display_startup_errors "0" PHP_INI_ALL  
log_errors "0" PHP_INI_ALL  
log_errors_max_len "1024" PHP_INI_ALL Available since PHP 4.3.0.
ignore_repeated_errors "0" PHP_INI_ALL Available since PHP 4.3.0.
ignore_repeated_source "0" PHP_INI_ALL Available since PHP 4.3.0.
report_memleaks "1" PHP_INI_ALL Available since PHP 4.3.0.
track_errors "0" PHP_INI_ALL  
html_errors "1" PHP_INI_ALL PHP_INI_SYSTEM in PHP <= 4.2.3.
xmlrpc_errors "0" PHP_INI_SYSTEM Available since PHP 4.1.0.
xmlrpc_error_number "0" PHP_INI_ALL Available since PHP 4.1.0.
docref_root "" PHP_INI_ALL Available since PHP 4.3.0.
docref_ext "" PHP_INI_ALL Available since PHP 4.3.2.
error_prepend_string NULL PHP_INI_ALL  
error_append_string NULL PHP_INI_ALL  
error_log NULL PHP_INI_ALL  
syslog.facility "LOG_USER" PHP_INI_SYSTEM Available as of PHP 7.3.0.
syslog.filter "no-ctrl" PHP_INI_ALL Available as of PHP 7.3.0.
syslog.ident "php" PHP_INI_SYSTEM Available as of PHP 7.3.0.
有关 PHP_INI_* 样式的更多详情与定义,见 配置可被设定范围

这是配置指令的简短说明。

error_reporting integer

设置错误报告的级别。该参数可以是一个任意的表示二进制位字段的整数,或者常数名称。错误级别和常数是在 预定义常量定义的,在 php.ini 之中也有专门的说明。在程序运行时,还可以通过 error_reporting() 函数进行设置。请查看 display_errors 了解详情。

在 PHP5.3 及以上版本中,默认值为 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED。 该设置不会显示 E_NOTICEE_STRICTE_DEPRECATED 级错误提示。在开发时可以把它们显示出来。 在 PHP 5.3.0 以前版本中,默认值是 E_ALL & ~E_NOTICE & ~E_STRICT。 在 PHP 4 中,默认值是 E_ALL & ~E_NOTICE

注意:

在开发阶段启用 E_NOTICE 会有一些好处。出于调试的目的:通知信息会对代码中可能出现的bug给出警告。例如,使用未预先分配和定义的值,就会给出警告。它对于查找拼写错误非常有用,并且可以节省调试的时间。通知信息也会警告你使用更好的代码风格。例如,$arr[item] 最好写成 $arr['item'] ,因为 PHP 会试图将 "item" 当成一个常量。如果它不是一个常量,PHP才会把它当做数组的字符串索引。

注意:

在PHP 5之中,提供了一个新的错误级别 E_STRICT。 因为 E_STRICT 并不包含在 E_ALL 之中,你必须明确启用才能显示这个类别的错误信息。在开发阶段启用 E_STRICT 会有一些好处。严格的信息将帮助你使用最新和最好的建议的方法来编写代码,例如它会警告你使用了将被废弃的函数。

注意: PHP外的PHP常量

在 PHP 以外使用PHP的常量是没有意义的,例如在 httpd.conf 之中, 你需要使用常量对应的 integer 值来取代。因为随着时间的推移和PHP的发展,会有更多的错误级别将被添加,因此错误级别的最大值(为 E_ALL)可能会改变 。因此在使用 E_ALL 对应整数值的地方,应该考虑使用较大的数值来涵盖当前和将来需要使用的二进制位字段,例如数值 2147483647 (将包含所有错误,而不仅仅是 E_ALL).

display_errors string

该选项设置是否将错误信息作为输出的一部分显示到屏幕,或者对用户隐藏而不显示。

设置 "stderr" 表示发送到 stderr 而不是 stdout"stderr"从 PHP 5.2.4 开始可用。在以前的版本中,该配置值的类型为 boolean.

注意:

这是一个辅助开发的功能,建议永远不要在生产系统中使用 (例如系统被连接到互联网对外提供服务)。

注意:

尽管 display_errors 也可以在运行时设置 (使用 ini_set()), 但是脚本出现致命错误时任何运行时的设置都是无效的。 因为在这种情况下预期运行的操作不会被执行。

display_startup_errors boolean

即使 display_errors 设置为开启, PHP 启动过程中的错误信息也不会被显示。强烈建议除了调试目的以外,将 display_startup_errors 设置为关闭。

log_errors boolean

设置是否将脚本运行的错误信息记录到服务器错误日志或者error_log之中。注意,这是与服务器相关的特定配置项。

注意:

在生产系统中,强烈建议你使用错误日志记录web站点上显示的错误信息。

log_errors_max_len integer

设置 log_errors 的最大字节数. 在 error_log 会添加有关错误源的信息。默认值为1024,如果设置为0表示不限长度。该长度设置对记录的错误,显示的错误,以及 $php_errormsg都会有限制作用。

当使用 int 时, 其值以字节来衡量。还可以使用在FAQ中描述的速记符。
ignore_repeated_errors boolean

不记录重复的信息。重复的错误必须出现在同一个文件中的同一行代码上,除非 ignore_repeated_source 设置为true。

ignore_repeated_source boolean

忽略重复消息时,也忽略消息的来源。当该设置开启时,重复信息将不会记录它是由不同的文件还是不同的源代码行产生的。

report_memleaks boolean

如果这个参数设置为Off,则内存泄露信息不会显示 (在 stdout 或者日志中)。This report will be send to stderr on Posix platforms. On Windows, it will be send to the debugger using OutputDebugString(), and can be viewed with tools like » DbgView。这只对调试编译有效,而且需要 error_reporting 包含了 E_WARNING 才会起作用

track_errors boolean

如果开启,最后的一个错误将永远存在于变量 $php_errormsg 中。

html_errors boolean

在错误信息中关闭HTML标签。这种新的HTML格式的错误信息是可以点击,它引导用户前往描述该错误或者导致该错误发生的函数的参考信息页面。 这些参考与 docref_rootdocref_ext 的设置有关。

xmlrpc_errors boolean

关闭正常的错误报告,并将错误的格式设置为XML-RPC错误信息的格式。

xmlrpc_error_number integer

用作 XML-RPC faultCode 元素的值。

docref_root string

新的错误信息格式包含了对应的参考页面,该页面对错误进行具体描述,或者描述了导致该错误发生的函数。为了提供手册的页面,你可以在PHP官方站点下载对应语言的手册,并在ini中设置网址到本地对应的地址。如果你的本地手册拷贝可以使用"/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

错误信息之前输出的内容。

error_append_string string

错误信息之后输出的内容。

error_log string

设置脚本错误将被记录到的文件。该文件必须是web服务器用户可写的。如果特殊值 syslog 被设置,则将错误信息发送到系统日志记录器。在Unix以及类似系统上,使用的是 syslog(3) ,而在 Windows NT 类系统上则为事件日志。Windows 95上不支持系统日志记录。参见: syslog(). 如果该配置没有设置,则错误信息会被发送到 SAPI 错误记录器。例如,出现在Apache的错误日志中,或者在CLI中发送到 stderr

syslog.facility string

指定记录日志信息的程序类型,仅在 error_log 设置为 "syslog" 时有效。

syslog.filter string

Specifies the filter type to filter the logged messages. Allowed characters are passed unmodified; all others are written in their hexadecimal representation prefixed with \x. There are three supported filter types:

  • all – all characters
  • no-ctrl – all characters except control characters
  • ascii – all printable ASCII characters and NL
仅在 error_log 为 "syslog" 时有效。
syslog.ident string

设置每条日志消息前缀的识别字符串(ident string),仅在 error_log 为 "syslog" 时有效。

add a noteadd a note

User Contributed Notes 6 notes

up
37
cjakeman at bcs dot org
13 years ago
Using
<?php ini_set('display_errors', 1); ?>
at the top of your script will not catch any parse errors. A missing ")" or ";" will still lead to a blank page.

This is because the entire script is parsed before any of it is executed. If you are unable to change php.ini and set

display_errors On

then there is a possible solution suggested under error_reporting:

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


[Modified by moderator]

You should also consider setting error_reporting = -1 in your php.ini and display_errors = On if you are in development mode to see all fatal/parse errors or set error_log to your desired file to log errors instead of display_errors in production (this requires log_errors to be turned on).
up
15
ohcc at 163 dot com
5 years ago
If you set the error_log directive to a relative path, it is a path relative to the document root rather than php's containing folder.
up
-1
Roger
2 years ago
When `error_log` is set to a file path, log messages will automatically be prefixed with timestamp [DD-MMM-YYYY HH:MM:SS UTC].  This appears to be hard-coded, with no formatting options.
up
-10
php dot net at sp-in dot dk
7 years ago
There does not appear to be a way to set a tag / ident / program for log entries in the ini file when using error_log=syslog.  When I test locally, "apache2" is used.
However, calling openlog() with an ident parameter early in your script (or using an auto_prepend_file) will make PHP use that value for all subsequent log entries. closelog() will restore the original tag.

This can be done for setting facility as well, although the original value does not seem to be restored by closelog().
up
-1
iio7 at protonmail dot com
5 months ago
It's important to note that when display_errors is "on", PHP will send a HTTP 200 OK status code even when there is an error. This is not a mistake or a wrong behavior, but is because you're asking PHP to output normal HTML, i.e. the error message, to the browser.

When display_errors is set to "off", PHP will send a HTTP 500 Internal Server Error, and let the web server handle it from there. If the web server is setup to intercept FastCGI errors (in case of NGINX), it will display the 500 error page it has setup. If the web server cannot intercept FastCGI errors, or it isn't setup to do it, an empty screen will be displayed in the browser (the famous white screen of death).

If you need a custom error page but cannot intercept PHP errors on the web server you're using, you can use PHPs custom error and exception handling mechanism. If you combine that with output buffering you can prevent any output to reach the client before the error/exception occurs. Just remember that parse errors are compile time errors that cannot be handled by a custom handler, use "php -l foo.php" from the terminal to check for parse errors before putting your files on production.
up
-33
jaymore at gmail dot com
5 years ago
Document says
So in place of E_ALL consider using a larger value to cover all bit fields from now and well into the future, a numeric value like 2147483647 (includes all errors, not just E_ALL).

But it is better to set "-1" as the E_ALL value.
For example, in httpd.conf or .htaccess, use
php_value error_reporting -1
to report all kind of error without be worried by the PHP version.

官方地址:https://www.php.net/manual/en/errorfunc.configuration.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3