在PHP 5.5.9 ini_set('display_errors', 1)
中可能会失败,如:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
//nosuchfunction();// Display Errors succeeds. "Fatal error: Call to undefined function"
$test=array(1 2 ); // Display Errors fails! No error displayed. HTTP ERROR 500
?>
我该如何解决这个问题?
答案 0 :(得分:9)
tl; dr 您的第一个示例错误 - 对未定义函数的调用 - 是您可以在同一脚本中使用ini_set()
显示的错误。第二个错误 - array(1 2 )
中的语法错误 - 无法在同一个脚本中使用ini_set()
显示,因为PHP甚至从未开始执行损坏的脚本。要查看该错误,您必须执行以下三项操作之一:(1)更改配置文件,(2)在另一个脚本中调用ini_set()
并include
损坏的脚本,或者(3)只看在服务器日志而不是在屏幕上显示错误。
问题不在于ini_set()
;这行是语法错误:
$test=array(1 2 );
如您所知,这是无效的PHP,因为您只有2个相邻的数字,没有逗号分隔符。来自the manual(强调补充):
可以使用array()语言构造创建数组。它需要任意数量的以逗号分隔的键=&gt;值对作为参数。
你可能意味着:
$test=array(1, 2 );
// ^ Notice the comma. This is important!
语法错误导致解析器错误,a / k / a "white screen of death."解析器在解析阶段放弃并终止 。这意味着它永远不会运行一行脚本,包括您的ini_set()
或error_reporting()
来电。因此,您不会获得任何输出,但错误仍会显示在您的服务器日志中。
关键点: PHP引擎从不运行语法错误的脚本的任何部分。这意味着ini_set()
和error_reporting()
调用也不会运行。您必须在损坏的脚本上的 PHP choke之前设置配置选项。您可以在php.ini
或其他文件中执行此操作。您无法在包含语法错误的同一文件中执行此操作。
根据评论,听起来好像是尝试导致解析器错误然后在屏幕上显示。您无法在同一脚本中使用ini_set()
执行此操作,因为PHP在解析阶段失败。也就是说,它甚至无法安全地解释脚本,因此它会停止尝试,并且不会执行该脚本中的任何代码行。
要解决此问题,您需要执行以下两项操作之一,如this canonical answer中所述:
将这些行添加到php.ini
文件中:
error_reporting = E_ALL
display_errors = 1
或
将损坏的脚本包装在include
或require
中,如下所示:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Nota bene: 从不在制作中执行此操作。如果你想在开发或质量保证中这样做,很好,但在生产中在屏幕上显示原始PHP错误是一种安全风险。