如何在使用 Lighttpd 和 Fast-CGI 时显示 PHP 错误


How to display PHP errors when using Lighttpd and Fast-CGI?

我正在使用FastCGI运行Lighttpd网络服务器,并且网络服务器没有输出PHP解析错误。

我的 php.ini 文件具有以下设置:

error_reporting = E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = On
html_errors = On

我像这样在我的 PHP 脚本中为开发启用错误输出(对于其他环境具有冗余):

error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
ini_set( 'html_errors', 'On' );

大多数错误输出正常。 解析错误不会。 下面是引发解析错误的示例代码。该错误不是由Lighttpd Web服务器输出的,而是在从命令行执行时输出的,因为它没有使用FastCGI。(注意缺少的连接运算符):

<?php echo 'foo' 'bar'; ?>

我发现如果我在 php 中设置display_errors = On.ini那么使用 FastCGI 和 Lighttpd 正确解析错误输出,但随后我无法使用 ini_set( 'display_errors', 0 ) 在我的 PHP 脚本中关闭它们。

我希望能够在开发应用程序时在我的应用程序中显示这些,并且能够在不更改 php.ini 配置的情况下关闭它们以进行生产。 使用 FastCGI 时,我的 PHP 应用程序中没有办法做到这一点吗?

不显示错误的原因是,当代码中存在致命错误(例如您的示例)时,代码根本不执行,因此永远不会设置display_errors值。

从 php.net (http://www.php.net/manual/en/errorfunc.configuration.php#ini.display-errors):

尽管可以在运行时设置display_errors(使用 ini_set()),但如果脚本出现致命错误,它不会产生任何影响。这是因为不会执行所需的运行时操作。

我找到的一个解决方案是在您正在开发并希望看到错误输出的目录中使用 .user.ini 文件(它们的功能类似于 Apache 的 .htaccess 文件)。没有一种好方法可以修改 PHP 代码以显示致命错误,因为包含致命错误的代码永远不会运行。

因此,对于上面的示例,您可以在与包含以下行的 php 文件相同的目录中使用 .user.ini 文件:

error_reporting = -1
display_errors = On
html_errors = On

有关详细信息,请参阅 http://php.net/manual/en/configuration.file.per-user.php

谢谢杰克的回答,这真的很有帮助。但是我想补充一点,创建 .user.ini 文件并添加代码行对我不起作用。

我将这些行添加到 .user.ini 文件中:

error_reporting = E_ALL
display_errors = On
html_errors = On
display_startup_errors = On
log_errors = On

在此之后,我能够看到错误并解决问题。