【问题标题】:Parse errors are not displayed不显示解析错误
【发布时间】:2026-01-06 22:30:01
【问题描述】:

我希望 PHP 在屏幕上显示解析错误。我得到的是一个空白页。没有任何内容被写入服务器的错误日志文件。

我的设置:PHP5.2.9/IIS 6(不是 Apache!)。

我的 PHP.INI:

error_reporting=E_STRICT
display_errors = On
display_startup_errors = On
log_errors = On
error_log = "C:\Program Files\Zend\ZendServer\logs\php_error.log"

如何在屏幕上记录或显示解析错误或致命错误?

谢谢, 手鞠

更新:使用不同的开关后,它看起来是 IIS 特定的问题。有什么想法吗?

【问题讨论】:

  • PHP 是安装为 cgi 还是 isapi 模块?你检查display_startup的有效设置吗... with var_dump(ini_get('display_startup_errors'), get_cfg_var('display_startup_errors')); ?
  • 你试过在命令行上执行脚本吗? “php -f scriptname.php”,或尝试使用“-l”标志检查语法。

标签: php iis-6 error-reporting


【解决方案1】:

在php文件本身设置错误级别并不能解决这里的问题,因为文件本身无法解析!!

您需要更改 php.ini 中的 error_reporting 行,如下所示:

error_reporting = E_ALL

顺便说一句:php.ini 文件中有一些示例说明如何显示哪种类型的错误消息。

祝你好运,

mcemoz

【讨论】:

    【解决方案2】:

    Apache 也不总是喜欢报告解析错误。从命令行运行

    php -l <file>
    

    -l 开关告诉 PHP 检查文件语法。请参阅手册页。

    【讨论】:

    • 这有点帮助,但它告诉你的只是你确实有解析错误,但它没有说明这些错误可能在哪里!
    • 据我所知,lint 开关将报告它在给定文件中发现的第一个语法错误的性质和位置。
    • 我在 iis 6.0 上运行 php 5.3,而 -l 所做的只是说:“解析 c:\path\file.php 时出错”
    • 这与 Apache 无关。
    【解决方案3】:

    E_STRICT 不包含在E_ALL 中(直到 PHP 6)。如果你想继续得到E_STRICT

    在 php.ini 中:

    error_reporting = E_ALL | E_STRICT
    

    在运行时:

    error_reporting( E_ALL | E_STRICT );
    

    您需要在 php.ini 中设置错误报告级别(和display_errors)才能查看语法错误。如果 PHP 遇到语法错误,运行时不会被执行,因此在运行时设置将不起作用。 (请参阅display_errors 链接。)

    【讨论】:

    • 在 PHP 5.4.0 中,E_STRICT 成为 E_ALL 的一部分。见error_reporting()
    • 当我 6 年前写这个答案时,我真的不记得这是否是 error_reporting() 的有效论据。
    【解决方案4】:

    您可以在终端中使用此命令验证脚本语法:

    php -l path/to/file.php
    

    就个人而言,我将此行添加到我的~/.bash_profile 文件中,这样我就可以轻松地在当前工作目录中的所有文件上运行php -l

    phpl() { for i in *.php; do php -l $i; done }
    

    如果您真的很铁杆,您甚至可以从命令行运行您的应用程序。您将有更好的机会看到编译时错误,这有点酷。

    您可以使用 $argv 变量来获取第一个参数 $argv[1],然后将其用作请求。

    <?php
    // show those errors!
    error_reporting(E_ALL | E_STRICT);
    ini_set('display_errors', 1);
    
    // simulate a web server request
    $request = '/' . isset($argv[1]) ? ltrim($argv[1], '/') : '/';
    $_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] = $request;
    

    然后您可以通过命令行运行您的脚本。这相当于访问: your-webapp.com/request/uri/here

    php /path/to/script.php request/uri/here
    

    这是一个通过命令行运行 CodeIgniter 的更全面的示例。它也应该适用于许多其他框架:http://phpstarter.net/2008/12/run-codeigniter-from-the-command-line-ssh/

    【讨论】:

      【解决方案5】:

      正如 Rasmus Lerdorf 所建议的,始终在开发服务器上使用 error_reporting(-1)。

      【讨论】:

      • 我可以看到这是您对问题的第一个答案,因此您没有代表将其发布为评论,但将来您可能需要考虑将其发布为评论。答案应该是解决问题的方法,您很有信心会解决问题。
      • PHP 提示 - 开发期间脚本顶部的 error_reporting(-1) 以打开所有 PHP 版本中的所有警告、通知等 twitter.com/rasmus/status/7448448829
      【解决方案6】:

      Re: php死机黑屏,我发现了那个设置

      php_value error_reporting "E_ALL" 或 php_value error_reporting 8192

      在我的 Windows 7 上的 .htaccess 中,带有 apache 2.2.4 和 php 5.3.13 的 Wampserver 是获得空白 php 错误屏幕的可靠方法——今天,2014 年 6 月 3 日。这些 htaccess 行确实设置了期望值在 phpinfo() 中,但只有在 htaccess 中注释掉(未使用)该行时才会显示错误。

      但是……下一分钟我发现

      php_value error_reporting 8191

      确实设置了 phpinfo() 值并且还允许向浏览器显示错误消息!哦!它必须是一个整数,而且显然也是一个特定的或有效的整数,而不仅仅是一个足够大的整数!

      【讨论】:

        【解决方案7】:

        如果您使用 Zend Framework (v1) 并使用 Autoloader,则以下代码将防止显示解析错误:

        self::$Autoloader-&gt;suppressNotFoundWarnings(true);

        更多详情请查看以下答案:

        Display php errors when using Zend framework

        【讨论】:

        • 原帖中提到了ZF吗?
        【解决方案8】:

        试试这个。

        error_reporting(E_ALL);
        ini_set("display_errors", 1);
        

        【讨论】:

        • @VolkerK - 就是这样。会不会是 IIS 特有的问题?