在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
?>
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
tl; dr您的第一个示例错误 - 对未定义函数的调用 - 是您可以通过ini_set()在同一脚本中使用来显示的错误.第二个错误 - 语法错误array(1 2 )- 无法ini_set()在同一个脚本中显示,因为PHP甚至从未开始执行损坏的脚本.要查看错误,你必须做的三两件事之一:(1)修改配置文件,(2)调用ini_set()的另一个脚本和include破碎的脚本,或者(3)只要看看服务器日志,而不是显示的错误-屏幕.
你的问题不在于ini_set(); 这行的语法错误:
$test=array(1 2 );
Run Code Online (Sandbox Code Playgroud)
如您所知,这是无效的PHP,因为您只有2个相邻的数字,没有逗号分隔符.从手册(重点补充):
可以使用array()语言构造创建数组.它将任意数量的逗号分隔的key =>值对作为参数.
你可能意味着:
$test=array(1, 2 );
// ^ Notice the comma. This is important!
Run Code Online (Sandbox Code Playgroud)
语法错误导致解析器错误,a/k/a是"死亡的白屏".解析器在解析阶段放弃并死亡.这意味着它永远不会运行一行脚本,包括您的ini_set()或error_reporting()调用.因此,您不会获得任何输出,但错误仍会显示在您的服务器日志中.
关键点: PHP引擎从不运行语法错误的任何脚本部分.这意味着ini_set()和error_reporting()调用不运行,无论是.您必须在损坏的脚本上的PHP choke之前设置配置选项.您可以php.ini在其他文件中或其他文件中执行此操作 您不能在包含语法错误的同一文件中执行此操作.
根据评论,听起来你正试图导致解析器错误,然后在屏幕上显示它.您无法ini_set()在同一脚本中执行此操作,因为PHP在解析阶段失败.也就是说,它甚至无法安全地解释脚本,因此它会停止尝试,并且不会执行该脚本中的任何代码行.
要解决这个问题,你需要做两件事之一,正如这个规范的答案所解释的那样:
将这些行添加到您的php.ini文件中:
error_reporting = E_ALL
display_errors = 1
Run Code Online (Sandbox Code Playgroud)
要么
将破碎的脚本包装在include或中require,如下所示:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Run Code Online (Sandbox Code Playgroud)Nota bene: 永远不要在生产中这样做.如果你想在开发或质量保证中这样做,很好,但在生产中在屏幕上显示原始PHP错误是一个安全风险.