如何在PHP中获取有用的错误消息?

我发现在PHP编程相当令人沮丧。 通常我会尝试运行这个脚本,然后回到空白屏幕。 没有错误信息,只是空的屏幕。 原因可能是一个简单的语法错误(错误的括号,缺less分号),或一个失败的函数调用,或完全是其他的东西。

弄清楚出了什么问题是非常困难的。 我最终评论了代码,在各处input“回声”声明等,试图缩小这个问题的范围。 但是肯定有更好的方法吧?

那么,有没有办法让PHP像Java那样产生有用的错误信息呢? 任何人都可以推荐良好的PHPdebugging技巧,工具和技术?

对于语法错误,您需要在php.ini中启用错误显示。 默认情况下,这些closures是因为您不希望“客户”看到错误消息。 在PHP文档中查看这个页面 ,获取有关这两个指令的信息: error_reportingdisplay_errorsdisplay_errors可能是你想改变的。 如果您不能修改php.ini,您也可以将以下行添加到.htaccess文件中:

 php_flag display_errors on php_value error_reporting 2039 

您可能需要考虑使用E_ALL的值(如Gumbo提到的)为您的PHP版本进行error_reporting以获取所有错误。 更多信息

3其他项目:(1)您可以检查错误日志文件,因为它将包含所有错误(除非日志logging已被禁用)。 (2)添加以下两行将帮助您debugging非语法错误的错误:

 error_reporting(-1); ini_set('display_errors', 'On'); 

(3)另一个select是使用一个编辑器来检查你input的错误,比如PhpEd 。 PhpEd还附带了一个可以提供更多详细信息的debugging器。 (PhpEddebugging器与xdebug非常相似,并直接集成到编辑器中,因此您可以使用1个程序来执行所有操作。)

卡特曼的链接也非常好: http : //www.ibm.com/developerworks/library/os-debug/

以下启用所有错误:

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

另请参阅以下链接

您可以在要debugging的文件中包含以下行:

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

这覆盖了php.ini中的默认设置,这只会让PHP将错误报告给日志。

PHPconfiguration

php.ini中的 2个条目规定了错误的输出:

  1. display_errors
  2. error_reporting

生产中display_errors通常设置为Off (这是一件好事,因为生产站点的错误显示通常是不可取的!)。

但是,在开发中 ,应将其设置为On ,以便显示错误。 检查

error_reporting (自PHP 5.3开始)默认设置为E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (意思是除通知,严格标准和弃用声明外都显示)。 如有疑问,请将其设置为E_ALL以显示所有错误。 检查

哇! 没有检查! 我不能改变我的php.ini!

这是一个耻辱。 通常共享主机不允许改变他们的php.ini文件,所以,这个选项是可悲的不可用。 但是不要害怕! 我们有其他的select!

运行时configuration

在所需的脚本中,我们可以在运行时更改php.ini条目! 意思是,脚本运行时会运行! 甜!

 error_reporting (E_ALL); ini_set ("display_errors", "On"); 

这两行将和上面的php.ini条目一样起作用! 真棒!

我仍然得到一个空白页面/ 500错误!

这意味着脚本甚至没有运行! 这通常发生在语法错误!

有了语法错误,脚本甚至不能运行。 它在编译时失败,这意味着它将使用php.ini中的值,如果你没有改变,可能不允许显示错误。

错误日志

另外,PHP默认会logging错误。 在共享主机中,它可能位于专用文件夹中,或与违规脚本位于同一文件夹中。

如果您有权访问php.ini,可以在error_log条目下find它。

有一个非常有用的扩展名为“ xdebug ”,这将使您的报告更好。

对于快速,动手的故障排除,我通常在这里build议SO:

 error_reporting(~0); ini_set('display_errors', 1); 

被放置在正在陷于困境的脚本的开头。 这是不完美的,完美的变体是,你也可以在php.ini启用它,并loggingPHP中的错误,以捕捉语法和启动错误。

这里列出的设置显示所有的错误,通知和警告,包括严格的,无论哪个PHP版本。

接下来的事情要考虑:

  • 安装Xdebug并使用IDE启用远程debugging。

另见:

  • 错误报告(PHP正确的方法)
  • 预定义的常量文件
  • error_reporting() 文件
  • display_errors 文件

如果你超级酷,你可以尝试:

 $test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192"; ini_set('display_errors',$test_server); error_reporting(E_ALL|E_STRICT); 

这只会在本地运行时显示错误。 它也给你test_servervariables在适当的地方在其他地方使用。

脚本运行之前发生的任何错误都不会被捕获,但是对于99%的错误,这不是问题。

在页面顶部select一个参数

 error_reporting(E_ERROR | E_WARNING | E_PARSE); 
 error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 1); ini_set('html_errors', 1); 

另外,你可以用xdebug获得更详细的信息。

要坚持这一点,使其confortale,你可以编辑你的php.ini文件。 它通常存储在/etc/php.ini/etc/php/php.ini ,但更多的本地php.ini可能会覆盖它,这取决于你的托pipe服务提供商的设置准则。 检查顶部Loaded Configuration Filephpinfo()文件,以确定哪一个最后加载。

在该文件中searchdisplay_errors。 应该只有3个实例,其中2个被评论。

将未注释的行更改为:

 display_errors = stdout 

你可以在PHP中注册自己的error handling程序 。 例如,将所有错误转储到文件可能会帮助您处理这些不明确的情况。 请注意,无论您将当前的error_reporting设置为什么,您的函数都会被调用。 非常基本的例子:

 function dump_error_to_file($errno, $errstr) { file_put_contents('/tmp/php-errors', date('Ymd H:i:s - ') . $errstr, FILE_APPEND); } set_error_handler('dump_error_to_file'); 
 error_reporting(E_ALL | E_STRICT); 

并打开php.ini中的显示错误

我build议Nette Tracy更好地查看PHP中的错误和exception:

Nette Tracy截图

试试这个PHP错误报告参考工具 。 这是一个很好的视觉参考,帮助我理解复杂的错误报告机制。

FirePHP也可以是有用的。

您需要从PHP获取有用的错误的两个关键行是:

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

正如其他贡献者指出的,出于安全原因,这些默认情况下被closures。 作为一个有用的技巧 – 当您设置站点时,为不同的环境进行切换非常方便,因此在本地和开发环境中,这些错误默认为开启。 这可以通过下面的代码来实现(理想的情况是在你的index.php或者config文件中,这样从一开始就是有效的):

 switch($_SERVER['SERVER_NAME']) { // local case 'yourdomain.dev': // dev case 'dev.yourdomain.com': ini_set('display_errors',1); error_reporting(E_ALL); break; //live case 'yourdomain.com': //... break; } 

您可能还想尝试PHPStorm作为您的代码编辑器。 在编辑器中input时,会发现许多PHP和其他语法错误。

如果你是一个Ubuntu用户,那么转到你的terminal并运行这个命令

 sudo tail -50f /var/log/apache2/error.log 

它将显示最近的50个错误。 对于logging所有错误的apache2,有一个错误文件error.log

您可以启用完整的错误报告(包括通知和严格的消息)。 有些人觉得这个太冗长了,但是值得一试。 将error_reporting设置为E_ALL | E_STRICT E_ALL | E_STRICT在你的php.ini中。

 error_reporting = E_ALL | E_STRICT 

E_STRICT会通知您有关已弃用的function,并为您提供有关执行某些任务的最佳方法的build议。

如果您不需要通知,但是您发现其他消息types有帮助,请尝试排除通知:

 error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE 

还要确保在php.ini中启用了display_errors 。 如果您的PHP版本早于5.2.4,请将其设置为On

 display_errors = "On" 

如果您的版本是5.2.4或更新,请使用:

 display_errors = "stderr" 

要打开完整的错误报告,请将其添加到脚本中:

 error_reporting(E_ALL); 

这甚至导致最小的警告显示。 而且,以防万一:

 ini_set('display_errors', '1'); 

将强制显示错误。 这应该在生产服务器上closures,但不是在开发时。

除了error_reporting和display_errors ini设置,您可以从Web服务器的日志文件中获得SYNTAX错误。 当我开发PHP时,我将开发系统的Web服务器日志加载到我的编辑器中。 每当我testing一个页面,得到一个空白的屏幕,日志文件过时,我的编辑询问是否要重新加载它。 当我这样做的时候,我跳到了底部,出现了语法错误。 例如:

 [Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9 

对于开发者来说,“错误”是最有用的东西,可以让他们知道自己的错误,并帮助他们使系统正常工作。

PHP提供了一些更好的方法来了解开发人员为什么以及他们的代码在哪里获取错误,所以通过了解这些错误,开发人员可以通过多种方式使代码更好。

在脚本的顶部写下面两行代码以获取所有错误消息的最佳方法:

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

另一种在IDE中使用debugging工具(如xdebug )的方法。

打开错误报告是正确的解决scheme,但是在启动错误报告的程序中似乎不起作用,但仅在后续包含的程序中生效。

因此,我总是创build一个文件/程序(我通常称之为“genwrap.php”),它与这里stream行的解决scheme具有基本相同的代码(即打开错误报告),然后包含我实际需要的页面呼叫。

有两个步骤来实现这个debugging;

– 创buildgenwrap.php并把它放在它的代码:

 <?php error_reporting(-1); ini_set('display_errors', 'On'); include($_REQUEST['page']); ?> 

两个 – 更改链接到你想要debugging的程序/页面通过genwrap.php去,

例如:更改:

 $.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */ 

 $.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */ 

http://todell.com/debug也可以是有用的。; 即使在生产模式下,您也可以看到自己的对象值或在场景后面抛出debugging错误。

除了上面非常多的优秀答案,您还可以在您的项目中实现以下两个function。 它们将在应用程序/脚本退出之前捕获每个非语法错误。 在function内部,您可以进行回溯并logging或向公众提供令人愉快的“正在维护中的网站”消息。

致命错误:

 register_shutdown_function 

http://php.net/manual/en/function.register-shutdown-function.php

错误:

 set_error_handler 

http://php.net/manual/en/function.set-error-handler.php

回溯:

 debug_backtrace 

http://php.net/manual/en/function.debug-backtrace.php

使用Kint。 它是类固醇debugging命令的组合。 https://raveren.github.io/kint/与Nette Tracy非常相似

我通常的问题是“小,愚蠢的”parsing器错误,不幸的是没有出现。

但是,当.PHP文件包含具有分析器错误的文件时,会显示它们! 所以我想写一个以执行文件名称作为参数启动的“executor-script”,例如example.com/sx.php?sc=buggy.php

它已经救了我很多头痛,也许这将有助于其他人,也:)

sx.php

 $sc = $_GET["sc"]; if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) { echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)"; } else { $sc = $_GET["sc"]; if (false==stripos('.php',$sc)) $sc.='.php'; // adjust this if your preferred extension is php5! require($sc); } ?>