如何使ini_set('display_errors')正常工作?

Chr*_*sJJ 1 php

在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)

我怎样才能解决这个问题?

eli*_*ide 9

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在解析阶段失败.也就是说,它甚至无法安全地解释脚本,因此它会停止尝试,并且不会执行该脚本中的任何代码行.

要解决这个问题,你需要做两件事之一,正如这个规范的答案所解释的那样:

  1. 将这些行添加到您的php.ini文件中:

    error_reporting = E_ALL
    display_errors = 1
    
    Run Code Online (Sandbox Code Playgroud)

    要么

  2. 将破碎的脚本包装在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错误是一个安全风险.

  • @ChrisJJ 您可能对 PHP 的工作方式有错误的期望。它不会逐行读取并立即执行文件。有一个解析步骤,其中解析整个文件,然后是执行代码的运行时。语法错误在第一步中失败,之后就没有第二步了。 (2认同)