首先,一般情况下关于php
的错误信息显示要在php.ini
配置文件中进行配置。配置项如下:
error_reporting = E_ALL & ~E_STRICT & ~E_DEPRECATED
display_errors = On
display_startup_errors = On
log_errors = On
error_log = php_errors.log
display_errors
控制PHP
是否要输出错误信息。默认情况下是On
开启的。在开发环境中这个选项要打开,方便开发过程中调试。但是到了生产环境,这个选项要关闭; error_reporting
是控制错误显示级别的 默认值 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; display_startup_errors
这个选项是控制PHP解析器在启动的过程中产生的错误是否显示,而 display_errors
是PHP解析器已经准备完成,在解析执行我们的PHP代码的时候产生的错误信息。二者控制的阶段是不同的。 同样,在开发环境中开启,生产环境关闭。默认情况下是关闭的;
log_errors
控制是否将错误信息记录的日志中去,默认情况下是 Off
,关闭将错误信息写入日志。 如果设置为On
,则将错误信息写入error_log
指定的日志文件或者日志服务。 该选项要想开启,则前提是display_errors
必须关闭(Off
)。 如果display_errors
开启,则错误信息由PHP
显示出来,而不会记录到日志中。也就是说 两者不可同时发生(当然可以同时关闭)。 所以说生产环境要将display_errors
关闭,而将该选项打开。 error_log
指定错误信息记录的位置。 每个选项详细说明,以及需要搭配其他哪些选项等可以去php.ini
文件中查看。
然而,如果我们的环境是 Docker
+ PHP-FPM
,错误信息的配置就不受php.ini
的控制了。配置项在fpm
的配置文件中。配置项
[www]
php_flag[display_errors] = off
php_admin_value[error_log] = /usr/local/var/log/php-fpm.www.error.log
php_admin_flag[log_errors] = on
php_admin_value[error_reporting] = E_ALL & ~E_DEPRECATED & ~E_STRICIT
php_admin_value[display_startup_errors] = on
可以看到[]
中对应的都是php.ini
中的选项。每个选项的含义和上面我们说的是一样的。下面我们介绍一下 php_*flag
和 php_*value
。一共有四种配置
-
php_flag
-
php_value
-
php_admin_flag
-
php_admin_value
其中 php_*flag
这种配置项的值只能是 on, off, 1, 0, true, false, yes or no。也就是说表示控制开关的选项要用php_*flag
; 而php_*value
选择性就多了,它指定的选项可以根据需要任意的赋值。
对于 php_flag
和 php_value
指定的选项,是可以在PHP
代码中通过函数ini_set
覆盖的。 而php_admin_flag
和php_admin_value
指定的选项是不能用ini_set
函数覆盖的。
还有一个比较重要的地方是。如果要打开PHP
的错误信息记录日志的功能,那么由error_log
指定的日志文件必须是已经存在的。不要指望程序在写日志的时候自动创建日志文件(可以通过docker的文件映射功能,将本地的一个文件映射到相应的地方)。
其实
php_*flag
/php_*value
就是用来覆盖php.ini
中的选项的。php.ini
中的配置项是对整个PHP
环境生效,也就是所有的工作池都会受php.ini
配置的影响。 而通过php_*flag
/php_*value
就可以根据每个工作池各自的需要来进行自己的配置。 就像上面的www
工作池。 工作池通过[]
进行指定([www]
)。