如何显示PHP错误?

How do I get PHP errors to display?

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

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

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

还有什么事要做?


这对我来说总是有用的:

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

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

1
display_errors = on


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

此问题可能提供其他信息。


在php.ini中:

1
display_errors = on

然后重新启动Web服务器。


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

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

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

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

-或

2.(b)把display_errors = On放在你的php.ini里。

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

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

1
php -l index.php

如果您包含来自另一个PHP脚本的脚本,那么它将在包含的脚本中显示语法错误。例如:

index.php

1
2
3
4
5
6
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

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


一些Web宿主提供程序允许您更改.htaccess文件中的php参数。

您可以添加以下行:

1
php_value display_errors 1

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


您可能会发现"错误报告"或"显示错误"的所有设置在PHP 7中似乎都不起作用。这是因为错误处理发生了变化。试试这个:

1
2
3
4
5
6
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不向后兼容):

1
2
3
4
5
6
7
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'];
}


这将起作用:

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

用途:

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

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

1
php -l phpfilename.php

在index.php文件中设置:

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


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

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

1
2
3
display_errors = on

display_startup_errors = on

下面是一个PHP脚本:

1
2
3
4
5
6
7
8
9
<?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.ini文件),但仍然无法收到错误消息,请尝试创建一个启用错误报告的新php文件,然后包括问题文件。如:

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

尽管在我的php.ini文件中已经正确设置了所有内容,但这是我捕获名称空间错误的唯一方法。我的确切设想是:

1
2
3
4
5
6
7
8
9
10
11
12
//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作为Apache模块时,我们可以使用Apache配置文件(例如httpd.conf)和.htaccess文件中的指令更改配置设置。您将需要"allowoverride选项"或"allowoverride all"特权来执行此操作。

检查这个

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


因为我们现在运行的是PHP7,所以这里给出的答案不再正确。唯一还可以接受的是来自FrankForte的一个,他谈到了php7。

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

这里有三段代码:

文件:TST1.PHP

1
2
3
4
5
6
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing" and ;
    echo"Testing
?>

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

现在,试试这个:

文件:TST2.PHP

1
2
3
4
5
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

文件:TST3.PHP

1
2
3
4
<?php
    // Missing" and ;
    echo"Testing
?>

现在运行设置错误报告的TST2,然后包括TST3。你会看到:

Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in tst3.php on line 4


您可以执行以下操作:

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

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

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

对于所有错误、警告和通知:

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

所有错误:

1
    error_reporting(E_ERROR);

对于所有警告:

1
    error_reporting(E_WARNING);

所有通知:

1
    error_reporting(E_NOTICE);

有关详细信息,请查看此处。


如果您发现自己处于无法通过php.ini.htaccess修改设置的情况,那么当您的PHP脚本包含解析错误时,您将无法显示错误。然后,您必须解决在命令行上这样的问题:

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

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

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


在我的普通PHP项目中,我通常使用以下代码,这些代码非常小。如果项目规模扩大,我建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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.');
    }
}

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

1
2
3
4
5
function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg ="Something bad happened. [$errno] $errstr
    File: $errfile
    Line: $errline
    [cc lang="
php"]".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."

;回声$MSG;返回错误;}函数exc_处理程序($exception){错误处理程序(0,$exception->getmessage(),$exception->getfile(),$exception->getline());}函数关闭函数()。{$error=error_get_last();如果($error["type"]==1){错误处理程序($error["type"],$error["message"],$error["file"],$error["line"]);}}设置"错误处理程序"("erru handler",e_all&;~e_notice&;~e_strict&;~e_deprecated);注册"关机"功能("关机功能");设置_exception_handler("exc_handler");< /代码>


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

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


如果是快速调试,您可以使用的最佳/简单/快速解决方案是围绕代码捕获异常。当我想在生产中快速检查某些东西时,这就是我要做的。

1
2
3
4
5
6
7
try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(),"
"
;
}


这就是我学到的。在php.ini文件中,

1
2
error_reporting = E_ALL
display_errors = On


只写:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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文件应该禁用显示错误。但是,对于开发环境,可以启用显示错误进行故障排除。


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

1
2
display_errors = on
display_startup_errors = on

或者您也可以使用以下代码,因为这对我来说总是有效的

1
2
3
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);**strong text**


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

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

force_display_errors

Type: int, Default value: 0, Introduced in Xdebug >= 2.3 If this
setting is set to 1 then errors will always be displayed, no matter
what the setting of PHP's display_errors is.

force_error_reporting

Type: int, Default value: 0, Introduced in Xdebug >= 2.3
This setting is a bitmask, like error_reporting. This bitmask will be logically ORed with the bitmask represented by error_reporting to dermine which errors should be displayed. This setting can only be made in php.ini and allows you to force certain errors from being shown no matter what an application does with ini_set().


您可能需要使用以下代码:

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