如何显示 PHP 错误?

How do I get PHP errors to display?

提问人:Abs 提问时间:6/28/2009 最后编辑:ezio4dfAbs 更新时间:9/20/2023 访问量:3484009

问:

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

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

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

还有什么可做的?

php 处理 语法- 错误报告

评论

10赞 brandonscript 10/29/2013
我还没有确切地确定为什么这有时有效而有时不起作用,但对于任何想要快速切换 php 脚本中的错误(或通过参数启用它们)的人来说,这两行大部分时间都有效。$_REQUEST
0赞 jewelhuq 1/13/2016
好吧,您可以通过从PHP ini文件启用xdebug来查看错误的详细信息。
1赞 Alexander Behling 12/10/2020
大多数特定的编辑器/ IDE,例如Notepad ++,Eclipse都有内置的语法检查和突出显示,它们会像您描述的那样向您显示问题。请不要在实时系统上打开错误显示。黑客会喜欢这个,因为在大多数情况下都会显示路径。您可以定义错误/例外处理程序。在此处理程序中,您可以记录问题并向开发人员发送邮件,以便他可以在问题发生时立即修复它。请参阅 php.net/manual/en/function.set-error-handler.phpphp.net/manual/en/function.set-exception-handler.php

答:

165赞 Michael Madsen 6/28/2009 #1

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

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

161赞 user1803477 1/8/2013 #2

你的php.ini中:

display_errors = on

然后重新启动 Web 服务器。

评论

9赞 m93a 2/24/2015
+①.在我的 ubuntu /etc/php5/apache2/php.ini 上
7赞 Peter Krauss 9/1/2015
用于重新启动(Debian、Ubuntu 等)sudo service apache2 restart
4赞 Pea 1/11/2016
用于在 OS X 上重新启动。sudo apachectl -k restart
5赞 Frankenmint 7/24/2016
有趣的事实:如果你简单地输入phpinfo(),你可以找到你的php.ini文件加载;添加到一个空白的 PHP 文件中。它是第 7 排向下并称为Loaded Configuration File
0赞 cazort 8/4/2021
这对我不起作用。事实上,我可以调用它,它返回一个空字符串(意味着它被关闭了)。是的,我检查以确保它是配置文件中唯一的一行。设置不知何故被覆盖了,我不知道为什么,这让我发疯。是的,我已经搜索了所有内容,它也不是这些文件之一。是的,我也重新启动了 Web 服务器。不,文件中没有任何内容。我使用的是PHP 7.4.6。ini_get('display_errors')/etc/php.d/.htaccess
55赞 Kalhua 5/18/2013 #3

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

您可以添加以下行:

php_value display_errors 1

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

评论

0赞 Lazaros Kosmidis 10/9/2018
如果您在 nginx 环境中,则将 php 值添加到位置 ~\.php 指令下的站点(站点可用)配置中。fastcgi_param PHP_VALUE “ error_reporting=E_ALL;\n display_errors=1;”;
111赞 andre 1/29/2014 #4

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

1. 在从浏览器调用的 PHP 脚本中包含以下行(通常为 index.php):

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

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

- 或者 -

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

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

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

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

评论

0赞 KevinHJ 7/23/2021
在执行php -l phpfilename.php时,我得到的只是一条消息,上面写着“解析sql_lab.php时出错”。它没有告诉我错误是什么。
0赞 Chris S. 12/22/2021
除了空白屏幕之外,它还将返回错误 500,这比没有内容更安全。
3567赞 Fancy John 1/29/2014 #5

DEV 环境

这总是对我有用:

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

但是,这不会使 PHP 显示同一文件中发生的解析错误。此外,这些设置可以被 PHP 覆盖。在这些情况下,显示这些错误的唯一方法是使用以下行修改php.ini(或php-fpm.conf):

display_errors = on

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

php_flag display_errors 1

PROD 环境

请注意,上述建议仅适用于 DEV 环境。在实时站点上,它必须是

display_errors = off
log_errors = on

然后,您将能够在错误日志中看到所有错误。请参阅在何处查找 PHP 错误日志

AJAX 调用

如果是 AJAX 调用,请在 DEV 服务器上打开 DevTools (F12),然后打开 “网络” 选项卡。 然后发起您想要查看结果的请求,它将出现在“网络”选项卡中。单击它,然后单击“响应”选项卡。在那里,您将看到确切的输出。

在实时服务器上时,只需检查错误日志即可。

评论

11赞 Snap 5/9/2015
另请注意,您可以使用这 3 行,然后 include('fileImWorkingOn.php');。然后你也可以发现语法错误!
18赞 Ryan Taylor 7/10/2015
虽然我不是SysOps,但我认为更多的人拥有.htaccess文件而不是php.ini,而且这些都会在解析之前出现,对吧? 对于 .htaccessphp_flag display_errors 1
1赞 Michael 5/17/2016
那么,既然错误被记录下来,它们会去哪里呢?我去了 /var/log/apache2,它显示了所有日志,但没有关于我最近运行的程序的信息。我每天早上只得到一次有关系统重启的信息。
3赞 Gerard Roche 9/14/2016
E_ALL不足以显示 PHP 5.3 中的所有错误。“ become part of in 5.4.0” - PHP Manual 您需要或在那个版本中。E_STRICTE_ALLE_ALL | E_STRICT-1
2赞 Angry 84 11/10/2016
每个人都有一个,很少有人有一个文件......编辑他们的PHP.ini文件的能力是另一回事。大多数公共服务器允许使用自定义 php.ini 文件。PHP.ini.htaccess
35赞 Mahendra Jella 5/5/2014 #6

这将起作用:

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

评论

0赞 Rob Moll 10/23/2020
2020 年 10 月:这对我有用。就是这么简单。不要乱用.htaccess或php.ini。完成后,只需将其注释掉或删除即可。PHP 7.4
20赞 NavyaKumar 4/1/2015 #7

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

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

display_errors = on

display_startup_errors = on
16赞 jxmallett 4/24/2015 #8

如果尽管遵循了上述所有答案(或者您无法编辑 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赞 peterh 7/17/2018
不,错误报告不是日志级别,而是位字段。使用 999999 是一个非常糟糕的主意,使用一些 2 的幂减 1,例如 2047!
0赞 jxmallett 7/18/2018
你是绝对正确的,@peterh!我已将其更改为 E_ALL,因为这将启用所有错误的报告(php 5.4 及以下版本中的严格错误除外)。
14赞 chiborg 1/11/2016 #9

如果您以某种方式发现自己处于无法修改设置的情况,或者当您的 PHP 脚本包含解析错误时,您不走运地显示错误。然后,您必须解决在命令行上对文件进行 linting 处理,如下所示:php.ini.htaccess

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

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

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

评论

0赞 scones 11/24/2017
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'更简单
46赞 Frank Forte 3/29/2016 #10

警告:以下答案与事实不符。错误处理中没有任何更改,未捕获的异常与其他错误一样显示。建议的方法必须谨慎使用,因为尽管有display_error设置,但它会无条件地输出错误,并且可能会通过在实时站点上向外部人员泄露敏感信息而构成威胁。

您可能会发现“错误报告”或“显示错误”的所有设置在 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赞 vdegenne 1/22/2017
你的意思是PHP7还是PHP7.1?我很困惑,我尝试了提出的经过验证的答案并且它有效,我认为您提出的一些恕我直言,确实“没有向后兼容性”,如果您必须修改完整的 PHP < 7 代码并需要在您已经定义的 php 代码中随处添加代码,我什至不想去想那会是一团糟。try{} catch() {}
0赞 Frank Forte 3/23/2017
@FancyJohn,这可能会有所帮助:.$bt = debug_backtrace(); print_r($bt);
0赞 Frank Forte 3/23/2017
@ballangddang,我在 PHP 7.0 中遇到了问题,我唯一可以显示错误的方法是使用 try/catch 块,特别是 catch。如果您将所有请求(除了 JavaScript、CSS、图像等)重写到 index.php 文件中,然后在其中放置 try catch 块,它会更容易。是的,任何没有单一入口点的系统都会让人头疼。Error
1赞 Martin Tournoij 6/5/2017
PHP 不显示未经处理的异常吗?很确定确实如此?
1赞 Paul Spiegel 2/5/2019
这看起来是个坏主意。是时候使用(或写入)全局异常处理程序了。
35赞 Abhijit Jagtap 5/5/2016 #11

用:

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

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

php -l phpfilename.php
3赞 jewelhuq 1/14/2017 #12

只需写:

error_reporting(-1);
17赞 Channaveer Hakari 2/1/2017 #13

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

        case 'PRODUCTION':
            $base_url = 'Production URL'; /* https://google.com */
            error_reporting(E_ALL);
            ini_set('display_errors', 0);
            ini_set('display_startup_errors', 0);
            ini_set('log_errors', 1); // Mechanism to log errors
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}
14赞 Binit Ghetiya 2/1/2017 #14

您可以执行如下操作:

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

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

有关更多信息,请查看此处

评论

0赞 Peter Mortensen 2/17/2019
什么是“主索引文件”?文件?index.html
5赞 Xakiru 3/27/2017 #15

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

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

评论

0赞 Frank Forte 8/19/2017
对于php7,更好...或者下面的另一个捕获块catch (Throwable $e)catch(Error $e)
0赞 Your Common Sense 2/4/2023
这段代码实际上很危险。在任何情况下,都不应在生产环境中使用它。因为它会将错误消息泄露给任何人,而不仅仅是添加它的开发人员。在生产环境中,必须记录所有错误因此,开发人员可以随时查看错误日志。它将捕获所有错误,而不仅仅是开发人员刷新浏览器时发生的错误。无需添加任何代码。这使得这段代码不仅危险,而且毫无用处。
0赞 Xakiru 2/5/2023
兄弟,他正在快速调试,而不是启动一个网站来捕获错误,危险是无关紧要的,没有人希望向客户显示错误而不是空白页。是的,我们可以给他写一个记录器,或者看看他用什么来为他提供正确的解决方案,但这是stackoverflow,需要大量的聊天和互动才能知道他的具体需求。你的常识。
7赞 Joel Wembo 5/9/2017 #16

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

error_reporting(E_ALL);

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

error_reporting =on
20赞 Peter 5/20/2017 #17

为了显示解析错误,您可以使用一个技巧来代替在 php.ini 中设置:使用 include。display_errors

以下是三段代码:

文件:tst1.php

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

直接运行此文件时,它将不显示任何内容,因为在 php.ini 中设置为 0。display_errors

现在,试试这个:

文件:tst2.php

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

文件:tst3.php

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

现在运行 tst2.php 设置错误报告,然后包含 tst3。您将看到:

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

评论

1赞 Hebe 12/18/2020
我花了一些时间弄清楚这一点。他们为什么要改变 php 5 的行为?
1赞 Magnus 12/30/2022
这值得更多的赞成。就我而言,关键是启用错误报告并在 中定义错误处理程序,并从该文件中定义错误处理程序 include,其中可以包含包含错误的其他文件。如果在包含其他文件中有错误的同一文件中启用错误报告,则该功能将不起作用。init0.phpinit1.php
1赞 Your Common Sense 2/4/2023
建议的方法实际上是正确的,但解释是错误的。PHP7 没有任何变化。PHP5 和 PHP3 都无法解析出现语法错误的文件。问题是解析错误,而不是PHP版本。所提出的解决方案适用于任何PHP版本。
0赞 Peter 2/4/2023
我有一个非常大的网站运行 PHP5 并使用 php.ini 设置,所有错误都是可见的,这解释了所有其他答案。当我更新到 PHP7 时,没有任何其他更改,就不可能看到错误。因此,即使解决方案适用于每个版本,其他答案对于旧版本都是正确的。
12赞 lintabá 6/4/2017 #18

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

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");
23赞 Sumit Gupta 9/26/2017 #19

索引.php文件中设置以下内容:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
3赞 Peter Haberkorn 10/19/2017 #20

如果您安装了 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 对应显示哪些错误进行 dermine 处理。此设置只能在 php 中进行.ini并允许您强制显示某些错误,无论应用程序如何使用 ini_set()。

4赞 pardeep 5/24/2018 #21
    <?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);
    ?>

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

2赞 gvlasov 10/25/2019 #22

如果它在命令行上,您可以运行 with 以覆盖以下设置:php-ddisplay_errors=1php.ini

php -ddisplay_errors=1 script.php
2赞 NVRM 11/26/2019 #23

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

./script 2> errors.log

在脚本中,像往常一样使用或等效(STDOUT 和 STDERR 都将接收输出),但仅在日志文件中写入var_dump()

fwrite(STDERR, "Debug infos\n"); // Write in errors.log^

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

tail -f errors.log

或者干脆

watch cat errors.log

评论

0赞 Peter Mortensen 4/22/2020
这如何回答关于PHP的问题?
1赞 Shaikh Nadeem 12/31/2019 #24

报告除E_NOTICE之外的所有错误

error_reporting(E_ALL & ~E_NOTICE);

显示所有 PHP 错误

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

关闭所有错误报告

error_reporting(0);
12赞 webcoder.co.uk 1/9/2022 #25

接受的asnwer包括额外的选项。在我的 DEVELOPMENT apache vhost 中的 PHP 文件中(.htaccess,如果您可以确保它不会进入生产环境):

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

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

display_errors = on

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

// I've added some extra options that set E_ALL as per https://www.php.net/manual/en/errorfunc.configuration.php.
php_flag log_errors on
php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2147483647
php_value error_log /var/www/mywebsite.ext/logs/php.error.log
0赞 Really Nice Code 3/14/2022 #26

如果您使用的是 SharedHosting 计划(例如在 hostgator 上)...只需添加

php_flag display_errors 1

添加到 .htaccess 文件并将其上传到远程文件夹可能不会产生服务器上生成的实际警告/错误。

您还需要做的是编辑php.ini

这就是您通过cPanel(在hostgator共享主机上测试)进行操作的方式 计划)

登录到cPanel后,搜索MultiPHP INI编辑器。 它通常位于 cPanel 项目列表的 SOFTWARE 部分下。

MultiPHP INI编辑器页面上...您可以停留在“基本模式”选项卡上,只需选中行上显示display_errors的按钮即可。 然后单击“应用”按钮进行保存。

enter image description here

重要:只需记住在完成调试后将其关闭即可;因为不建议将此用于公共服务器。

0赞 theking2 12/3/2022 #27

由于不清楚您在什么操作系统上,这些是我的 2 个 Windows 美分。 如果您使用的是 XAMPP,则需要在 下手动创建文件夹。不是你的错,ApacheFriends 省略了这一点。logsC:\xampp\php

要阅读并关注此文件,请执行。

Get-Content c:\xampp\php\logs\php_error_log -Wait

为此,请在 VSCode 中创建一个任务.vscode\tasks.json

{ 
  // See https://go.microsoft.com/fwlink/?LinkId=733558 
  // for the documentation about the tasks.json format 
  "version": "2.0.0", 
  "tasks": [ 
    { 
      "label": "Monitor php errors", 
      "type": "shell", 
      "command": "Get-Content -Wait c:\\xampp\\php\\logs\\php_error_log", 
      "runOptions": { 
        "runOn": "folderOpen" 
      } 
    } 
  ] 

并让它在文件夹加载时运行。