Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中获取有用的错误消息?_Php_Debugging_Error Handling - Fatal编程技术网

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

如何在PHP中获取有用的错误消息?,php,debugging,error-handling,Php,Debugging,Error Handling,我经常会尝试运行一个PHP脚本,然后返回一个空白屏幕。没有错误信息;只是一个空屏幕。原因可能是一个简单的语法错误,错误的括号,缺少分号,或者函数调用失败,或者完全是其他原因 很难找出哪里出了问题。最后,我对代码进行注释,到处输入echo语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧 有没有办法让PHP像Java一样生成有用的错误消息?对于语法错误,需要在PHP.ini中启用错误显示。默认情况下,这些选项处于关闭状态,因为您不希望客户看到错误消息。在PHP文档中,可以获得关于两个指令的信

我经常会尝试运行一个PHP脚本,然后返回一个空白屏幕。没有错误信息;只是一个空屏幕。原因可能是一个简单的语法错误,错误的括号,缺少分号,或者函数调用失败,或者完全是其他原因

很难找出哪里出了问题。最后,我对代码进行注释,到处输入echo语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧


有没有办法让PHP像Java一样生成有用的错误消息?

对于语法错误,需要在PHP.ini中启用错误显示。默认情况下,这些选项处于关闭状态,因为您不希望客户看到错误消息。在PHP文档中,可以获得关于两个指令的信息:error\u reporting和display\u errors。显示错误可能是您要更改的错误。如果无法修改php.ini,还可以将以下行添加到.htaccess文件中:

php_flag  display_errors        on
php_value error_reporting       2039

您可能想考虑使用GunBo所提到的EyALL的值来为Error报告提供PHP版本,以获得所有的错误。p> 3其他项目:1您可以检查错误日志文件,因为它将包含所有错误,除非已禁用日志记录。2添加以下两行有助于调试非语法错误:

error_reporting(-1);
ini_set('display_errors', 'On');
3另一个选项是使用编辑器,在键入时检查错误,例如。PhpEd还附带了一个调试器,可以提供更详细的信息。PhpEd调试器与xdebug非常相似,并直接集成到编辑器中,因此您可以使用一个程序来完成所有操作

Cartman的也很好:

您可以在PHP中注册自己的。例如,在这些模糊的情况下,将所有错误转储到文件可能会对您有所帮助。请注意,无论当前设置为什么,函数都将被调用。非常基本的例子:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');

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

error_reporting(E_ALL);
ini_set('display_errors', '1');
这会覆盖php.ini中的默认设置,这只会使php向日志报告错误

error_reporting(E_ALL | E_STRICT);

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

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

error_reporting = E_ALL | E_STRICT
E_STRICT将通知您不推荐使用的函数,并为您提供执行某些任务的最佳方法的建议

如果您不想要通知,但发现其他邮件类型很有用,请尝试排除通知:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE
还要确保在php.ini中启用了display_errors。如果您的PHP版本早于5.2.4,请将其设置为打开:

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

display_errors = "stderr"

有一个非常有用的扩展名为,它也可以使您的报告更漂亮。

也很有用。

要启用完整的错误报告,请将以下内容添加到脚本中:

error_reporting(E_ALL);
这甚至会导致出现最小的警告。而且,以防万一:

ini_set('display_errors', '1');

将强制显示错误。这应该在生产服务器中关闭,但在开发时不能关闭。

除了错误报告和显示错误ini设置之外,您还可以从web服务器的日志文件中获取语法错误。在开发PHP时,我将开发系统的web服务器日志加载到编辑器中。每当我测试一个页面并得到一个空白屏幕时,日志文件就会过时,我的编辑器会询问我是否要重新加载它。当我这样做时,我跳到底部,出现语法错误。例如:

[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

错误和警告通常出现在..\logs\php_error.log或..\logs\apache_error.log中,具体取决于您的php.ini设置

此外,有用的错误通常会指向浏览器,但由于它们不是有效的html,因此不会显示


因此,当你看到一个空白屏幕时,使用IEs view->source菜单选项查看原始输出。

我总是在php脚本的最顶端使用这种语法

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off

我不知道这是否有帮助,但这里是我的php项目标准配置文件的一部分。即使在我自己的服务器上,我也不太依赖apache配置

我从来没有消失的错误的问题,所以也许这里的东西会给你一个想法

编辑以显示APPLICATON_LIVE

打开php.ini, 确保将其设置为:

display_errors = On

重新启动服务器。

以下选项将启用所有错误:

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>
另请参见以下链接


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

$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_服务器变量,以便在其他适当的地方使用


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

若要保持这一点并使其易于处理,可以编辑php.ini文件。它通常存储在/etc/php.ini或/etc/php/php.ini中,但更多本地php.ini可能会覆盖它,具体取决于宿主提供商的设置 思想线。检查顶部加载的配置文件的phpinfo文件,确保最后加载的是哪个配置文件

搜索该文件中的显示错误。应该只有3个实例,其中2个被注释

将未注释行更改为:

display_errors = stdout

对于快速、实际的故障排除,我通常建议如下:

error_reporting(~0); ini_set('display_errors', 1);
要放在脚本的开头,该脚本正在进行故障排除。这并不是完美的,完美的变体是您还可以在php.ini中启用它,并在php中记录错误以捕获语法和启动错误

这里列出的设置显示所有错误、通知和警告,包括严格的错误、通知和警告,而不管是哪个PHP版本

接下来要考虑的事项:

使用IDE安装并启用远程调试。 另见:


在页面顶部选择一个参数

error_reporting(E_ERROR | E_WARNING | E_PARSE);

以下代码应显示所有错误:

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

使用此代码生成空白页的唯一方法是在关机处理程序中出现错误时。我从我自己的cms复制并粘贴了它,没有对它进行测试,但我确信它是有效的。

对于开发者来说,“错误”是最有用的东西,可以让他们知道自己的错误并解决它们,从而使系统完美地工作

PHP提供了一些更好的方法来了解开发人员代码出错的原因和位置,因此通过了解这些错误,开发人员可以在许多方面改进代码

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

错误报告全部; ini_设置显示错误,1; 在IDE中使用调试器工具的另一种方法。

PHP配置 中的2个条目指示错误的输出:

在生产中,显示错误通常设置为Off,这是一件好事,因为在生产现场显示错误通常是不可取的

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

从PHP 5.3开始,错误报告默认设置为E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED。这意味着,除了通知、严格标准和弃用通知之外,所有内容都会显示。如果有疑问,请将其设置为E_ALL以显示所有错误。检查

哇,哇!没有支票!我无法更改我的php.ini! 真可惜。通常,共享主机不允许更改其php.ini文件,因此,遗憾的是,该选项不可用。但不要害怕!我们有

运行时配置 在所需的脚本中,我们可以在运行时更改php.ini条目!意思是,当脚本运行时,它将运行!好极了

所有人; 显示错误,打开; 这两行代码的效果与上面修改php.ini条目的效果相同!太棒了

我仍然得到一个空白页/500错误! 这意味着脚本甚至没有运行!这通常发生在语法错误的时候

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

错误日志 此外,PHP默认记录错误。在共享主机中,它可能位于专用文件夹中,也可能与违规脚本位于同一文件夹中


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

从php中获取有用错误所需的两行关键代码是:

ini_set('display_errors',1);
 error_reporting(E_ALL);
正如其他贡献者所指出的,出于安全原因,默认情况下会关闭这些功能。作为一个有用的提示—在设置站点时,可以方便地为不同的环境进行切换,以便在本地和开发环境中默认打开这些错误。理想情况下,可以在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作为代码编辑器。当您在编辑器中键入时,它会发现许多PHP和其他语法错误

错误报告全部严格; ini设置“显示错误”,1; ini_设置“html_错误”,1;
此外,如果您是ubuntu用户,您可以通过。

获得更详细的信息,然后转到您的终端并运行此命令

sudo tail -50f /var/log/apache2/error.log
它将显示最近的50个错误。 apache2有一个错误文件error.log,它记录了所有错误。

我建议在PHP中更好地可视化错误和异常:

这是加载与运行时配置的问题 认识到语法错误或解析错误发生在编译或解析步骤中是很重要的,这意味着PHP甚至在有机会执行任何代码之前就会退出。因此,如果您在运行时修改PHP的display_errors配置,这包括从在代码中使用ini_设置到使用.htaccess(一个运行时配置文件)的所有内容,那么只有默认加载的配置设置才起作用

如何在开发中始终避免WSOD 为了避免出现WSOD,您需要确保加载的配置文件上有显示错误和错误报告 ng设置为-1这相当于E_ALL,因为它确保无论运行哪个版本的PHP,所有位都处于打开状态。不要硬编码E_ALL的常量值,因为该值在不同版本的PHP之间可能会发生变化

加载的配置是加载的php.ini文件或apache.conf或httpd.conf或virtualhost文件。例如,当您第一次启动apachehttpd或php fpm时,这些文件在启动阶段仅读取一次,并且仅被运行时配置更改覆盖。确保加载的配置文件中的display_errors=1和error_reporting=-1可确保无论在运行时更改(如ini_set'display_errors',1)之前发生的语法或解析错误如何,都不会看到WSOD;或错误报告全部;可能发生

如何查找php.ini加载的配置文件 要定位加载的配置文件,只需使用以下代码创建一个新的PHP文件

<?php
phpinfo();
然后将浏览器指向此处,查看加载的配置文件和解析的其他.ini文件,这些文件通常位于phpinfo的顶部,并包含所有加载的配置文件的绝对路径

如果您看到的是none而不是文件,这意味着您在配置文件php.ini路径中没有php.ini。因此,您可以将其作为php.ini复制到配置文件路径中,然后确保您的php用户有足够的权限读取该文件。您需要重新启动httpd或php-fpm来加载它。请记住,这是php源代码附带的development php.ini文件。所以请不要在生产中使用它

只是不要在生产中这样做 这确实是避免开发中出现WSOD的最佳方法。任何建议您将ini设置为“显示错误”的人,1;或错误报告全部;在PHP脚本的顶部,或者像您在这里所做的那样使用.htaccess,在出现语法或解析错误时,不会帮助您避免WSOD,就像您在这里遇到的情况,如果您加载的配置文件关闭了display_errors


许多人和库存安装的PHP将使用默认情况下已关闭display_errors的生产ini文件,这通常会导致您在这里遇到的同样的挫折。因为PHP在启动时已经关闭了它,然后遇到语法或解析错误,并且没有任何输出。您希望您的ini设置“显示错误”,1;在PHP脚本的顶部,应该避免这种情况,但如果PHP无法解析代码,那就无关紧要了,因为它永远不会到达运行时。

可以注册一个钩子,使最后的错误或警告可见

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

将此代码添加到index.php的开头将有助于调试问题。

对于那些使用nginx的人来说,即使对于文件,也有一个白色屏幕,这是真的。在这种情况下,必须直接在ini中设置值-对于纯开发环境,这可能更可取。事实上,这是一个非常有用的调试工具,它使错误消息更加详细,具有完整的堆栈跟踪和变量转储以及所有内容。是的。然后使用VimDebugger插件之类的工具逐步检查代码并找出错误所在。这里是使用xdebug的NetBeans。太棒了。我不熟悉PHP,通常是ASP.NET,以前也发出过echo语句。与Tomalak的回答一样,这对语法错误不起作用。2039是E|u ERROR | E|u WARNING | E|u PARSE | E|u CORE | u WARNING | E|u COMPILE u WARNING | E| E|u USER | E| u USER |警告| E| E| u USER |注意。请看,我喜欢.htaccess文件的选项。它帮助我在一个不属于公共网站的区域进行调试。非常感谢你的建议!我想补充一点,将错误记录到文件中并在那里查找它们是最好的解决方案。不要依赖于在页面上显示错误-它们可能会破坏它,您可能会忘记打开生产站点的错误报告,这将在将来给您带来麻烦。遗憾的是,查看页面源代码也不会显示任何内容。解析错误应该在Apache的错误日志中可见,而不管您在其他地方有什么设置。如果您无法控制服务器,那么获取apache错误日志可能会很困难,但我建议您与提供商谈谈,并且有一些方法可以向您公开错误日志。除此之外,我只能建议其他人在部署到生产环境之前检查本地开发服务器中解析错误的代码。另外,像Eclipse的PDT这样的验证IDE可能会有很大的帮助。回到这里,我最近遇到了一个堆栈溢出问题,即使在日志中也没有生成任何错误,直到我将xdebug安装到服务器中,它才显示为这样。Gah.如果您无法修改php.ini,请创建一个包含php_标志display_errors 1的.htaccess文件。很抱歉,没有阅读已经发布的其他答案,请使用-1。这在.htaccess中得到了处理,正如已经多次提到的那样。通常的免费托管会忽略

.htaccess最好在.ini文件级别进行这些更改。在脚本中打开错误报告是无用的,因为它对语法错误或其他致命错误没有帮助,这些错误会扼杀编译阶段。脚本在开始执行并到达报告覆盖之前很久就被终止了。您确实是对的。我没有注意到移动到您自己的服务器。运行phpinfo以找到正确的php.ini文件。查找加载的配置文件行。如果要查找编译阶段发生的错误,请检查apache日志,通常位于/var/log/apache2/error.log。如果启用严格类型,则在php7上该答案将失败,因为ini_集的第二个参数是字符串。另请参阅@JuannStrauss,这是低估了它。当你最终看到错误时,它会说T_PAAMAYIM_NEKUDOTAYIM。或者可能。关于这方面的教程:如果要区分本地环境和生产环境,只需在php.ini中全局启用或禁用错误,而不是在也可以是生产代码的代码中启用或禁用错误。如果您需要在生产环境中调试生产网站,并且只希望您能够查看错误,请使用$\u SERVER['REMOTE\u HOST']检查客户端是否是您。我从该代码中获得一个空白页。你说的关机处理程序出错是什么意思?我该怎么解决这个问题?@PaoloM,他说的是上面函数ShutdownHandler中的一个错误。基本上,这是一个权宜之计,取代了正确的错误处理。谢谢,这很有用,但是我如何才能禁用此函数中的E_note errors?这是正确的解决方案,但在出现错误时要小心信息不确定。。。更喜欢记录而不是回显用户。当Symfony无法正确捕获致命错误时,我会使用此选项。@Eli,这会增加运行时开销,但每个页面请求都有。对于忽略调试设置的概念,不管服务器如何配置,在部署或维护正在开发的Xdebug时很好可以从php启用。iniTracy注意正确设置所有显示错误和错误报告选项,以便在原始帖子中描述的情况下提供输出。。。因此,这个工具对解决问题特别有用。有人能推荐好的PHP调试技巧、工具和技术吗?这是一款纯金工具,适用于那些陷入webhosts的用户,它没有显示错误,但允许零日志访问。我应该注意,FireHP是一个死项目,因为FireBug集成到Firefox控制台中。有点像是后继者,但不完全是。我也有同样的问题,这是因为Nginx默认配置文件缺少这一行。对于运行时配置,您可以将这些行放在一个单独的文件中&包括带有错误的php文件。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);