如何让PHP错误显示出来?

1986
我已经检查了我的 PHP ini 文件(php.ini),并且已经设置了 display_errors 和错误报告是 E_ALL。我已经重启了我的 Apache web 服务器。
我甚至在我的脚本顶部加入了这些行,但它甚至无法捕捉简单的解析错误。例如,我使用 "$" 声明变量,但我没有关闭语句";"。但所有我的脚本在出现这些错误时都显示一个空白页,但我希望实际上在浏览器输出中看到错误
error_reporting(E_ALL);
ini_set('display_errors', 1);

还有什么需要做的吗?


10
我尚未完全确定为什么有时候可以行得通,而有时候又不行,但对于任何想要快速切换PHP脚本中错误(或通过$_REQUEST参数启用它们)的人来说,这两行代码大多数情况下都能够奏效。 - brandonscript
你可以通过在php ini文件中启用xdebug来查看错误的详细信息。 - jewelhuq
1
大多数特定的编辑器/ IDE,例如Notepad++、Eclipse等都内置了语法检查和高亮功能。它们将显示您所描述的问题。请不要在生产环境中显示错误。黑客会喜欢这样做,因为在大多数情况下,路径会被显示出来。您可以定义错误/异常处理程序,在此处理程序中,您可以记录问题并向开发人员发送一封电子邮件,以便在出现问题时立即修复它。请参见https://www.php.net/manual/en/function.set-error-handler.php 和https://www.php.net/manual/en/function.set-exception-handler.php。 - Alexander Behling
27个回答

3566

开发环境

这对我来说总是有效的:

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

生产环境

请注意,上述建议仅适用于开发环境。在实际运行的网站上,必须进行

display_errors = off
log_errors = on

然后你就能在错误日志中看到所有的错误。参见在哪里找到PHP错误日志

AJAX调用

如果是AJAX调用,在开发服务器上,打开开发者工具(F12),然后选择网络选项卡。 然后发起你想要查看结果的请求,它将出现在网络选项卡中。点击它,然后选择响应选项卡。你将在那里看到精确的输出。

在生产服务器上,同样只需检查错误日志。


11
请注意,您可以使用这三行代码,然后加上('fileImWorkingOn.php');。这样您就可以捕获语法错误了! - Snap
18
虽然我不是系统管理员,但我认为拥有 .htaccess 文件的人会比拥有 php.ini 文件的人更多,这两个文件都会在解析之前生效,对吗?.htaccess 文件中使用 php_flag display_errors 1 来显示错误信息。 - Ryan Taylor
1
@Michael,错误信息会直接显示在屏幕上,或者输出到其他指定的地方。 - Fancy John
3
在PHP 5.3中,“E_ALL”无法显示“所有”错误。“E_STRICT”在5.4.0中成为“E_ALL”的一部分。在那个版本中,你需要使用“E_ALL | E_STRICT”或“-1”。请参考PHP手册 - Gerard Roche
2
每个人都有一个PHP.ini文件,但只有少数人拥有.htaccess文件...编辑他们的PHP.ini文件是另一回事。大多数公共服务器允许使用自定义php.ini文件。 - Angry 84
显示剩余11条评论

165

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

此问题 可能提供额外的信息。


161

在你的 php.ini 文件中:

display_errors = on

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


9
+①. 在我的Ubuntu系统中,/etc/php5/apache2/php.ini文件中。 - m93a
7
对于重新启动(Debian,Ubuntu等),请使用以下命令:sudo service apache2 restart - Peter Krauss
4
在 macOS 上重新启动 Apache,可以使用命令 sudo apachectl -k restart - Pea
5
有趣的事实:如果您在空白的PHP文件中输入phpinfo();,则可以找到已加载的php.ini文件,它位于第7行,并称为“Loaded Configuration File”。 - Frankenmint
这对我不起作用。实际上,我可以调用ini_get('display_errors'),它返回一个空字符串(表示已关闭)。是的,我检查过确保它是配置文件中唯一的行。该设置以某种方式被覆盖,我无法找出原因,这让我疯狂。是的,我搜索了/etc/php.d/中的所有内容,它也不是那些文件之一。是的,我也重启了Web服务器。不,.htaccess文件中没有任何东西。我使用的是PHP 7.4.6。 - cazort

111

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

1. 在您从浏览器调用的 PHP 脚本中(通常是 index.php)添加以下行:


1. Have these lines in the PHP script you're calling from the browser (typically 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

当我执行php -l phpfilename.php时,我只收到一条消息,上面写着“解析sql_lab.php时出现错误”。它没有告诉我错误的具体信息。 - KevinHJ
除了空白屏幕外,它还会返回错误500,这比没有内容更安全可靠。 - Chris S.

55

一些网站托管服务提供商允许您在.htaccess文件中更改PHP参数。

您可以添加以下行:

php_value display_errors 1
我也遇到了和你一样的问题,但是这个解决方案解决了它。

如果您正在使用nginx环境,则需要在location ~.php指令下将PHP值添加到您的站点(sites-available)配置中。 fastcgi_param PHP_VALUE " error_reporting=E_ALL;\n display_errors=1;"; - Lazaros Kosmidis

46

警告:以下答案的事实内容是错误的。在错误处理方面没有任何更改,未捕获异常会像其他错误一样显示出来。建议使用该方法时要谨慎,因为它无条件输出错误,尽管设置了“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
你是指PHP7还是PHP7.1?我有点困惑,我按照验证过的答案尝试了一下,它可以工作。我认为你提出的建议有些不同,在我看来,“没有向后兼容性”,如果你必须修改完整的PHP < 7代码并需要在已定义的php代码中添加try{} catch() {}代码,我甚至不想去想那将会是多么混乱的情况。 - vdegenne
1
PHP不会显示未处理的异常吗?我很确定它会显示。 - Martin Tournoij
它应该显示未处理的异常。如果你在开始时打开输出缓冲区(这样你可以在最终刷新响应正文之前的任何时间发送标头),也许异常消息会丢失在某个地方。 - Frank Forte
1
这看起来不是个好主意。是时候使用(或编写)全局异常处理器了。 - Paul Spiegel
@PaulSpiegel,哪一部分是一个坏主意?尝试/捕获块?我之前评论中提到的输出缓冲?每个都有其目的。例如,try/catch允许您在出现问题时采取不同的课程,而无需在异常处理程序中添加大型应用程序。输出缓冲允许进行服务器端缓存。 - Frank Forte
显示剩余4条评论

35

使用:

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

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

php -l phpfilename.php

35

这将起作用:

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

2020年10月:这个对我很有用。非常简单。不需要搞一些.htaccess或php.ini的东西。当你完成后,只需将其注释或删除即可。PHP 7.4 - Rob Moll

23

请在你的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接