提问



我检查了我的PHP ini文件并设置了显示错误,错误报告也是E_ALL。我重新启动了我的Apache Web服务器。


我甚至把这些行放在我的脚本的顶部,它甚至不会捕获简单的解析错误。例如,我用"$"声明变量而我不会关闭语句";"。但是我的所有脚本都显示这些错误的空白页面,但我想在浏览器输出中看到错误


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


还剩下什么?

最佳参考


这对我来说总是有用的:


ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


但是,这并没有使PHP显示解析错误 - 显示这些错误的唯一方法是使用以下行修改php.ini:


display_errors = on

其它参考1


在运行时启用错误输出时,您不能捕获解析错误,因为它在实际执行任何操作之前解析文件(因为在此期间遇到错误,它不会执行任何操作)。您将需要更改实际的服务器配置,以便启用display_errors并使用适当的error_reporting级别。如果您无法访问php.ini,您可能可以使用.htaccess或类似的,具体取决于服务器。


这个问题可能会提供额外的信息。

其它参考2


php.ini 中:


display_errors = on


然后重新启动Web服务器。

其它参考3


要显示您需要的所有错误:


1。在您从浏览器调用的PHP脚本中有这些行(通常是index.php):


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


2.(a)确保此脚本没有语法错误


- 或 -


2.(b)在php.ini 中设置display_errors = On


否则,它甚至不能运行那两行!


您可以通过运行(在命令行)检查脚本中的语法错误:


php -l index.php


如果包含来自其他PHP脚本的脚本,则将 在包含脚本中显示语法错误。例如:


index.php


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

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';


my_script.php


adjfkj // This syntax error will be displayed in the browser

其它参考4


某些Web托管提供商允许您在 .htaccess 文件中更改PHP参数。


您可以添加以下行:


php_value display_errors 1


我和你的问题一样,这个解决方案解决了这个问题。

其它参考5


您可能会发现错误报告或显示错误的所有设置似乎都不适用于PHP  7。那是因为错误处理已经改变。试试这个:


try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}


或者,一次性捕获异常和错误(这与PHP不向后兼容  5):


try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

其它参考6


这将有效:


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

其它参考7


使用:


ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


这是编写它的最佳方法,但语法错误会产生空白输出,因此请使用控制台检查语法错误。调试PHP代码的最佳方法是使用控制台;运行以下内容:


php -l phpfilename.php

其它参考8


index.php 中设置此项


ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

其它参考9


在PHP文件所在的文件夹中创建一个名为 php.ini 的文件。


在php.ini里面添加以下代码(我给出了一个显示代码的简单错误):


display_errors = on

display_startup_errors = on

其它参考10


这是一个PHP脚本:


<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>


有关PHP错误的更详细说明,请访问 PHP错误 - error_reporting()。[53]

其它参考11


当使用PHP作为Apache模块时,我们可以使用Apache配置文件(例如httpd.conf)和.htaccess文件中的指令更改配置设置。您需要AllowOverride Options或AllowOverride All权限才能执行此操作。


检查一下


http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess[54]

其它参考12


如果你发现自己处于无法通过php.ini.htaccess来修改设置的情况,那么当你的PHP脚本包含解析错误时,你就会显示错误。然后你必须解决这个命令行上的文件:[55]


find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"


如果主机被锁定以至于不允许通过php.ini.htaccess更改值,它也可能不允许通过ini_set更改值。您可以使用以下PHP脚本检查:


<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}

其它参考13


您可以执行以下操作:


在主索引文件中设置以下参数


    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);


然后根据您的要求,您可以选择要显示的内容:



  对于所有错误,警告和通知



    error_reporting(E_ALL); OR error_reporting(-1);



  对于所有错误



    error_reporting(E_ERROR);



  对于所有警告



    error_reporting(E_WARNING);



  所有通知



    error_reporting(E_NOTICE);


欲了解更多信息,请点击此处[56]

其它参考14


由于我们现在运行的是PHP7,因此这里给出的答案不再正确。唯一还可以的就是来自Frank Forte的那个,因为他谈到了PHP7。
另一方面,不是试图用try/catch捕获错误,而是可以使用一个技巧:使用include。
这里有3段代码:


文件:tst1.php


<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
// Missing " and ;
echo "Testing
?>  


在PHP7中运行它将不显示任何内容


现在,试试这个:


文件:tst2.php


<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
include ("tst3.php");
?> 


文件:tst3.php


<?php
// Missing " and ;
echo "Testing
?>  


现在运行tst2,它设置错误报告然后包括tst3。你会看见:


解析错误:语法错误,文件意外结束,期望变量(T_VARIABLE)或$ {(T_DOLLAR_OPEN_CURLY_BRACES)或第4行tst3.php中的{$(T_CURLY_OPEN)

其它参考15


如果,尽管遵循了上述所有答案(或者您无法编辑您的php.ini文件),您仍然无法收到错误消息,请尝试创建一个启用错误报告的新PHP文件,然后包含问题文件。例如:


error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');


尽管在我的php.ini文件中正确设置了所有内容,但这是我能够捕获命名空间错误的唯一方法。我的具体情况是:


//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}

其它参考16


我通常会在我的普通php项目中使用以下代码,这些代码非常小,如果项目变大,那么我会推荐。


if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT','DEVELOPMENT');
}

$base_url   =   null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url   =   'http://localhost/product/';
            ini_set('display_errors',1);
            ini_set('display_startup_errors',1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url   =   'Prod url'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}


希望这可以帮助。

其它参考17


您可以添加自己的自定义错误处理程序,它可以提供额外的调试信息。此外,您可以将其设置为通过电子邮件发送给您。


function ERR_HANDLER($errno ,$errstr, $errfile, $errline){
    $msg="<b>Someting bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0,$exception->getMessage(),$exception->getFile(),$exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"],$error["message"],$error["file"],$error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");

其它参考18


如果它是一个快速调试,你可以使用的最佳/简单/快速解决方案是用代码捕获异常来包围你的代码。当我想在生产中快速检查一些东西时,这就是我正在做的事情。


try {

//Page code

} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}


我希望这有帮助。

其它参考19


顶部的代码应该工作error_reporting(E_ALL);


但是,请尝试编辑手机中的代码


error_reporting=on

其它参考20


写吧:


error_reporting(-1);

其它参考21


这就是我学到的东西。在PHP.INI文件中


error_reporting = E_ALL
display_errors = On

其它参考22


如果安装了xdebug,则可以通过设置覆盖每个设置:


xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;



  force_display_errors

  
  类型:int,默认值:0,在Xdebug中引入>=2.3如果是这样
  设置设置为1,然后始终显示错误,无论如何
  PHP的display_errors的设置是什么。

  
  force_error_reporting

  
  类型:int,默认值:0,在Xdebug中引入>=2.3
  此设置是一个位掩码,如error_reporting。该位掩码将与error_reporting表示的位掩码进行逻辑OR运算,以便显示错误。此设置只能在php.ini中进行,并允许您强制显示某些错误,无论应用程序使用ini_set()做什么。


其它参考23


<?php
// Turn off error reporting
error_reporting(0);

// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Report all errors
error_reporting(E_ALL);

// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?


>


当您的站点处于Activity状态时,出于安全原因,php.ini文件应禁用display_errors。但是,对于开发环境,可以启用display_errors进行故障排除。