“display_errors”和Parse Errors之间的交互:仍然生成HTTP 500

时间:2012-10-26 21:38:58

标签: http-headers php

我有非常简单的测试用例,有关闭标记,故意使用额外的a

<?php echo 'test'; a?>

并且,没有结束标记,没有故意结束标记:

<?php echo 'test'; a

display_errors = On时:

  • 使用结束标记=&gt;测试注意:使用未定义的常量a - 在第3行的test.php中假定为'a'

  • 没有结束标签=&gt;解析错误:语法错误,第3行test.php中的意外$ end

display_errors = Off时:

  • 使用结束标记=&gt;测试

  • 没有结束标签=&gt; HTTP 500

为什么我收到HTTP 500错误?为什么输出(错误消息除外)是依赖display_errors选项?我认为它只能确定是否会打印错误。这是一个错误吗?

4 个答案:

答案 0 :(得分:0)

如果没有你的结束标记,php解释器将无法确定脚本的结束位置(从而以解析器错误结束)。

但是关闭它,它会将'a'解析为常量。但是没有常量'a',因此它会将其视为String,并且解析器将返回此字符串值。由于没有变量接收它,它只会被扔掉。 (解析器可能会删除此a,因为它不会影响应用程序)。

答案 1 :(得分:0)

原因如下:

当PHP看到结束?>标记时,它会添加一个隐式分号。这允许这样的语法:

<?php echo "something" ?>

为什么这很重要?

因为这意味着当您拥有结束标记时,您的迷路a实际上被视为a;

这种差异足以让PHP解析它。它没有识别它,所以它猜测它是一个未知的常数,你得到你看到的通知信息。

如果没有结束标记,并且没有分号,PHP会看到未终止的代码行。这是语法错误; PHP根本无法解析它,所以它放弃了。

希望能解释其中的差异。

(侧面说明,整个未知 - 常数 - 所以 - 我假设一个字符串是PHP最严重的错误之一。由于历史原因它在那里,但我真的希望他们在将来的某个时候弃用它;它会让代码对由于一个小错字导致的可怕错误敞开大门)

答案 2 :(得分:0)

这是PHP的解析器和语法的粗俗。

PHP允许您在T_CLOSE_TAG之前省略分号,因此当PHP解析器看到它时:

a?>

它假设你的意思是:

a; ?>

然后它会将undefined constant a强制转换为字符串并发出E_NOTICE。 (这是PHP的一个可怕的错误。)所以这实际上相当于:

'a'; ?>

由于这不是致命错误且该表达式没有副作用,因此程序正常执行。

但是,如果省略close标记,则会出现语法错误,因为没有任何信号表示表达式的结尾。语法错误是致命的,因此500 Internal Server Error是响应。

display_errors设置仅影响是否将错误打印到响应中(即,您是否看到noticeparse error消息。)

答案 3 :(得分:0)

我有不同的结果。作为OP的代码说,W / o结束标记,对我来说不会导致500错误。

<?php
error_reporting(0);
ini_set('display_errors', 0);
echo 'test'; a

相反,我得到:

Parse error: syntax error, unexpected $end in /my-path/test/index.php on line 4