如何显示PHP错误?


1730

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

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

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

还剩下什么呢?


8
我还没有确切说明为什么有时这样做的原因,而不是其他原因,但是对于任何想要快速切换php脚本错误(或通过$_REQUEST参数启用错误)的人来说,这两行大部分时间都是有效的。
brandonscript

好了,您可以通过从php ini文件启用xdebug来查看错误的详细信息。
jewelhuq

Answers:


3198

这总是对我有用:

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

9
另外请注意,您可以使用这3行,然后包含('fileImWorkingOn.php');。然后,您也可以捕获语法错误!
2015年

14
虽然我不是SysOps,但我认为比php.ini,更多的人拥有.htaccess文件,而这些文件都将在解析之前出现,对吗?php_flag display_errors 1.htaccess的费用
Ryan Taylor

1
因此,既然错误已记录下来,它们将去何处?我去了/ var / log / apache2,它显示了所有日志,但是没有关于我最近运行的程序的信息。我每天早晨只获得有关系统重新启动的信息。
迈克尔

1
@Michael错误直接出现在屏幕上或输出重定向到的地方
Fancy John

2
E_ALL不足以显示PHP 5.3中的所有错误。“ E_STRICT成为E_ALL5.4.0的一部分” -PHP手册您需要E_ALL | E_STRICT-1该版本。
Gerard Roche

155

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

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


2
不知道。我手动编辑了php.ini文件,它现在可以正常工作。谢谢!
Abs

143

在您的php.ini中

display_errors = on

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


7
+①。在我的ubuntu上/etc/php5/apache2/php.ini
m93a 2015年

5
重新启动(Debian的,Ubuntu的,等等)sudo service apache2 restart
彼得·克劳斯

4
用于在OS X上重新启动sudo apachectl -k restart
豌豆

3
有趣的事实:如果您只放入phpinfo(),则可以找到已加载的php.ini文件;到一个空白的PHP文件。它是第7行,并叫下Loaded Configuration File
Frankenmint

如果我们在cPanel上编写PHP代码Direclty,该怎么办?
arqam '16

98

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

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

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

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

-要么-

2.(b)display_errors = On放入您的php.ini

否则,它甚至无法运行这两行!

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

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

51

某些网络托管服务提供商允许您更改.htaccess文件中的PHP参数。

您可以添加以下行:

php_value display_errors 1

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


并且,如果您处于nginx环境中,则将php值添加到~~ .php指令下的站点(站点可用)配置中。fastcgi_param PHP_VALUE“ error_reporting = E_ALL; \ n display_errors = 1;”;
Lazaros Kosmidis '18 -10-9

40

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

1
您是说PHP7还是PHP7.1?我很困惑,我尝试按已提出的经过验证的答案进行尝试,它确实有效,我认为您提出的建议有点不同,恕我直言,确实是“无向后兼容性”,如果您必须修改完整的PHP <7代码并需要在try{} catch() {}各处添加代码在您已经定义的php代码中,我什至不想考虑即将发生的混乱
。– vdegenne

@FancyJohn,这可能会有所帮助: $bt = debug_backtrace(); print_r($bt);
Frank Forte

@ballangddang,我遇到了PHP 7.0的问题,在这里我唯一能显示错误的方法是使用try / catch块,尤其是catch Error。如果您将所有请求(JavaScript,CSS,图像等除外)重写为index.php文件,则在其中放置try catch块,这样会更容易。是的,任何没有单个入口点的系统都将很难更新。
Frank Forte

PHP是否不显示未处理的异常?可以肯定吗?
Martin Tournoij

它应该显示未处理的异常。如果在开始时打开输出缓冲区(以便可以在最终刷新响应正文之前的任何时间发送头),则异常消息可能会丢失到某个地方。
Frank Forte


33

采用:

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

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

php -l phpfilename.php

22

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

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

20

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

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

display_errors = on

display_startup_errors = on

18

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


2
这与Fancy John的答案有何不同?
所有工人都

@cpburnz-这是一个直截了当的问题,每个人在其风格上都给出了相同的代码集,这是唯一的区别。我还提供了一个URL链接,该链接将提供有关PHP错误的更多信息。
B.Balamanigandan

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 {
    ...
}

1
不,错误报告不是日志级别,而是位字段。使用999999是一个非常糟糕的主意,请使用一些2的幂减去1,例如2047!
彼得-恢复莫妮卡

你绝对正确,@ peterh!我将其更改为E_ALL,因为这将允许报告所有错误(php 5.4及以下版本中的严格错误除外)。
jxmallett

15

我通常会在普通的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.');
    }
}


14

如果您因某种原因陷入无法通过修改设置的情况,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.";
}

find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'更简单
scones

14

由于我们现在正在运行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)


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

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


什么是“主索引文件”?文件index.html
彼得·莫滕森

12

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

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


6

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

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

对于php7,catch (Throwable $e)更好...或下面的另一个捕获块catch(Error $e)
Frank Forte


4

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

error_reporting = E_ALL
display_errors = On

2
换车?添加到?
彼得·莫滕森

自动柜员机您的答案是没有道理的,因为它缺乏上下文;彼得·莫滕森(Peter Mortensen)也有规定。如果不加以改进,它将为“清除标记”做好准备(由机器人执行)。(来自低质量审核)。
ZF007

4
    <?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进行故障排除。


4

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

display_errors = on
display_startup_errors = on

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

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

3

如果安装了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()都可以使您强制显示某些错误。


3

您可能要使用以下代码:

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

2

报告除E_NOTICE以外的所有错误

error_reporting(E_ALL & ~E_NOTICE);

显示所有PHP错误

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

关闭所有错误报告

error_reporting(0);

1

在Unix CLI中仅将错误重定向到文件是非常实用的:

./script 2> errors.log

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

tail -f errors.log

或简单地

watch cat errors.log

这如何回答有关PHP的问题?
Peter Mortensen

./script是一个PHP CLI脚本(hashbang #!/usr/bin/php)。您可以通过这种方式将php错误重定向到文件中。这是Unix管道。这不是php作为CGI。
NVRM

0

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

php -ddisplay_errors=1 script.php

-1

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

一些托管服务提供商允许通过.htaccess和设置PHP设置httpd.conf

隐藏PHP错误

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

通过谷歌搜索找到了这个答案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.