1

服务器正在运行 PHP5.3。我通过在页面运行之前注释掉代码来发现问题。当我第一次加载页面时,我没有得到没有错误的输出。

我将错误报告设置为:

error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);

注意:需要禁用通知,因为系统很旧并且最初写得不好(我们现在正在一点一点地解决这个问题)

停止脚本运行而没有错误的行是这一行。

<?php echo explode('cms/', pageURL())[0]?>

这在 PHP5.4 中运行良好。5.3不支持这个很好,但为什么不显示错误?究竟是什么让调试变得如此困难?对于各种问题,这种情况已经发生过一两次,最好能更好地理解潜在问题。

这个问题是否有可能在 5.3 上显示错误?

错误报告正在服务器上工作。

poop();

退货

Fatal error: Call to undefined function poop()

编辑:更新代码时,编辑失败,并且有一行包含以下内容:

$parts = echo explode('cms/',pageURL());

这导致了同样的问题。没有输出,没有错误。脚本只是失败了。

4

5 回答 5

4

背景资料:

如果您的error_reporting设置是通过函数调用(不是设置文件)设置的,则在加载的第一个文件中出现语法错误index.php(例如:) ,PHP 解释器无法输出错误。

如果您有一个非常简单index.php的文件,其中包含带有致命语法错误的文件,那么 PHP 解释器将能够输出错误。

这是 PHP 解释器的“已知限制”,因为大多数解释器需要先分两次读取文件以获取标记,然后评估标记是否正确表示语言的语法(允许的标记顺序) .

实际运行代码是在解释器成功完成这两次传递之后发生的;如果不是,那么解释器所拥有的所有信息就是发生了语法错误,它不知道您已设置error_reporting为某个级别或其他级别,因为它认为从文件中读取的任何内容都是“无效语法”,所以它无法运行它。

具体信息:

由于您使用的是 PHP 5.4 提供但 PHP 5.3 没有提供的新语法语言结构,因此合法的 PHP 5.4 结构在 PHP 5.3 中会变成语法错误

error_reporting与语法错误相同的文件中调用 意味着不会发生函数调用并且错误级别将不会正确设置。

解决方法:

php.ini通过在您的文件或文件中声明它来设置您的错误级别.htaccess

于 2013-11-12T08:43:57.283 回答
2

解析文件前出现解析错误

使用以下代码:

<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);

echo explode('cms/', pageURL())[0]

在处理内容之前需要解析代码。默认情况下在显示错误的情况下运行,您会看到:

解析错误:语法错误,意外 '[',期待 ',' 或 ';' 在第 4 行的 index.php 中

或类似的。如果存在解析错误 - 根本不解析任何文件,则在文件的任何内容之前处理错误(从未处理过,因为它是一个致命错误),因此文件之前的错误报告设置是加载的是适用的。

相比之下,这将显示错误消息:

<?php
error_reporting(E_ALL^E_NOTICE);
ini_set('display_errors', 1);
require 'has_fatal_error.php';

<?php
// has_fatal_error.php;
echo explode('cms/', pageURL())[0]
于 2013-11-12T08:46:29.817 回答
0

我不确定这一点,但这种特定类型的错误可能属于E_STRICT. 在 PHP 5.4 中,E_STRICT包含在 中E_ALL,但在 5.3 中没有。

无论这是否修复它,将错误报告更改为

error_reporting(E_ALL ^ E_NOTICE | E_STRICT);
于 2013-11-12T08:45:58.247 回答
0

如果 apache 加载的第一个文件包含解析错误,则代码永远不会运行。

于 2013-11-12T08:46:17.187 回答
-3

您需要在ini文件中设置,short_open_tag = On然后您将收到错误

于 2013-11-12T08:43:14.387 回答