如何显示PHP错误?

2009-06-28 php error-handling syntax-error error-reporting

我已经检查了我的PHP ini文件( php.ini )并设置了display_errors ,并且错误报告为E_ALL 。我已经重新启动了Apache Web服务器。

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

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

还剩下什么呢?

Answers

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

该问题可能会提供其他信息。

在您的php.ini中

display_errors = on

然后重新启动您的Web服务器。

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

您可以添加以下行:

php_value display_errors 1

我遇到了与您相同的问题,并且此解决方案已解决该问题。

当使用PHP作为Apache模块时,我们可以使用Apache配置文件(例如httpd.conf)和.htaccess文件中的指令来更改配置设置。您将需要“ AllowOverride选项”或“ AllowOverride全部”特权。

检查一下

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

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

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

这总是对我有用:

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

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

display_errors = on

(如果您无权访问php.ini ,那么将此行放在.htaccess也可能有效):

php_flag display_errors 1

这将起作用:

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

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

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

display_errors = on

display_startup_errors = on

如果尽管遵循了上述所有答案(或者您无法编辑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 {
    ...
}

如果您因某种原因而无法通过php.ini.htaccess修改设置,那么当您的PHP脚本包含解析错误时,您将无法显示错误。然后,您必须解决以下问题: 在命令行上整理文件

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.";
}

这是一个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-error_reporting()

您可能会发现“错误报告”或“显示错误”的所有设置在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'];
}

用:

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

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

php -l phpfilename.php

写就好了:

error_reporting(-1);

我通常会在我的纯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 = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

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

您可以执行以下操作:

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

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

有关更多信息,请在此处检查。

如果是快速调试,则可以使用的最佳/便捷/快速解决方案是用捕获的异常包围代码。这就是我要快速检查生产中的内容时要执行的操作。

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

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

error_reporting = E_ALL
display_errors = On

上面的代码应该可以工作:

error_reporting(E_ALL);

但是,尝试在文件中的手机上编辑代码:

error_reporting =on

由于我们现在正在运行PHP 7,因此此处给出的答案不再正确。唯一尚可的是Frank Forte谈到的PHP 7。

另一方面,您可以使用技巧:使用include,而不是尝试通过try / catch捕获错误。

这里有三段代码:

档案:tst1.php

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

在PHP 7中运行此命令不会显示任何内容。

现在,尝试以下方法:

文件:tst2.php

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

文件:tst3.php

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

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

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

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

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something 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");

在您的index.php文件中进行设置:

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

如果安装了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表示的位掩码进行逻辑或运算,以确定应该显示哪些错误。此设置只能在php.ini中进行,无论应用程序如何使用ini_set()都可以使您强制显示某些错误。

    <?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);
    ?>

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

您可能要使用以下代码:

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

您可以通过更改php.ini文件并添加以下内容来完成此操作

display_errors = on
display_startup_errors = on

或者您也可以使用以下代码,因为这始终对我有用

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

除了php脚本中的php.iniini_set()函数之外,您还可以使用下面显示的.htaccesshttpd.conf指令执行相同的操作。

一些托管服务提供商允许通过.htaccesshttpd.conf设置php设置。

hide php errors

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

如果在命令行中,则可以使用-ddisplay_errors=1运行php来覆盖php.ini的设置:

php -ddisplay_errors=1 script.php

在unix cli中,将错误仅重定向到文件是非常实用的:

./script 2> errors.log

然后从另一个外壳进行实时更改:

tail -f errors.log

或简单地

watch cat errors.log

报告除E_NOTICE以外的所有错误

error_reporting(E_ALL & ~E_NOTICE);

显示所有PHP错误

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

关闭所有错误报告

error_reporting(0);

Related