如何在php中获得有用的错误消息?

egmofgnx  于 2021-06-19  发布在  Mysql
关注(0)|答案(17)|浏览(330)

我经常会尝试运行一个php脚本,然后返回一个空白屏幕。无错误信息;只是一个空屏幕。原因可能是一个简单的语法错误(括号错误,缺少分号),或者函数调用失败,或者完全是其他原因。
很难找出哪里出了问题。最后我注解掉代码,到处输入“echo”语句等等,试图缩小问题的范围。但肯定有更好的办法,对吧?
有没有办法让php像java那样生成有用的错误消息?

flvlnr44

flvlnr441#

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

$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\u server变量,以便在其他适当的地方使用。
在脚本运行之前发生的任何错误都不会被捕获,但是对于我所犯的99%的错误来说,这不是问题。

enyaitl3

enyaitl32#

对于语法错误,需要在php.ini中启用错误显示。默认情况下,这些选项是关闭的,因为您不希望“客户”看到错误消息。请查看php文档中的此页,以获取有关2个指令的信息: error_reporting 以及 display_errors . display_errors 可能是你想换的。如果无法修改php.ini,还可以将以下行添加到.htaccess文件中:

php_flag  display_errors        on
php_value error_reporting       2039

您可能需要考虑在php for的版本中使用e_all的值(正如gumbo所提到的) error_reporting 获取所有错误。更多信息
其他3项:(1)您可以检查错误日志文件,因为它将包含所有错误(除非已禁用日志记录)(2) 添加以下两行将帮助您调试非语法错误的错误:

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

(3) 另一个选择是使用一个编辑器来检查输入时的错误,例如phped。phped还附带了一个调试器,可以提供更详细的信息(phped调试器与xdebug非常相似,它直接集成到编辑器中,因此您可以使用一个程序来完成所有操作。)
cartman的链接也非常好:http://www.ibm.com/developerworks/library/os-debug/

kx5bkwkv

kx5bkwkv3#

有一个非常有用的扩展名为“xdebug”,它也可以使您的报告变得更好。

j8yoct9x

j8yoct9x4#

在页面顶部选择一个参数

error_reporting(E_ERROR | E_WARNING | E_PARSE);
qcuzuvrc

qcuzuvrc5#

这是一个加载与运行时配置的问题

认识到语法错误或解析错误发生在编译或解析步骤中是很重要的,这意味着php甚至在有机会执行任何代码之前就会退出。所以如果你修改php的 display_errors 在运行时进行配置(包括使用 ini_set 在使用.htaccess(运行时配置文件)的代码中,只有默认加载的配置设置才起作用。

如何在开发中避免wsod

要避免wsod,您需要确保加载的配置文件 display_errors 在和 error_reporting 设置为 -1 (这是等效的eèall,因为它确保无论运行哪个版本的php,所有位都处于打开状态)。不要硬编码e\u all的常量值,因为该值在不同版本的php之间可能会发生变化。
已加载的配置是 php.ini 文件或您的 apache.conf 或者 httpd.conf 或virtualhost文件。这些文件在启动阶段(例如,当您第一次启动apachehttpd或phpfpm时)只读取一次,并且只被运行时配置更改覆盖。确保 display_errors = 1 以及 error_reporting = -1 在您加载的配置文件中,确保您永远不会看到wsod,而不管在运行时更改之前发生的语法或解析错误,如 ini_set('display_errors', 1); 或者 error_reporting(E_ALL); 可能发生。

如何找到(php.ini)加载的配置文件

要定位加载的配置文件,只需使用以下代码创建一个新的php文件。。。

<?php
phpinfo();

然后将浏览器指向那里,查看加载的配置文件和解析的其他.ini文件,这些文件通常位于页面顶部 phpinfo() 并将包含所有已加载配置文件的绝对路径。
如果你看到 (none) 而不是文件,这意味着您在配置文件(php.ini)路径中没有php.ini。因此,您可以从这里下载与php捆绑在一起的stock php.ini,并将其作为php.ini复制到配置文件路径中,然后确保您的php用户有足够的权限读取该文件。您需要重新启动httpd或php-fpm来加载它。请记住,这是php源代码附带的development php.ini文件。所以请不要在生产中使用它!

只是不要在生产中这样做

这确实是避免开发中出现wsod的最佳方法。有人建议你 ini_set('display_errors', 1); 或者 error_reporting(E_ALL); 在php脚本的顶部,或者像您在这里所做的那样使用.htaccess,并不能帮助您避免在发生语法或解析错误时出现wsod(就像您在这里的例子),如果您加载的配置文件 display_errors 已关闭。
许多人(和股票安装的php)将使用一个生产ini文件,该文件具有 display_errors 默认情况下关闭,这通常会导致与您在这里经历的相同的挫折感。因为php已经在启动时关闭了它,然后遇到语法或解析错误,并且没有输出。你希望你的 ini_set('display_errors',1); 在php脚本的顶部,应该避免这种情况,但是如果php不能解析您的代码,则无关紧要,因为它永远不会到达运行时。

qc6wkl3g

qc6wkl3g6#

错误和警告通常出现在 ....\logs\php_error.log 或者 ....\logs\apache_error.log 取决于php.ini设置。
此外,有用的错误通常会指向浏览器,但由于它们不是有效的html,因此不会显示。
所以呢 "tail -f 你的日志文件,当你得到一个空白屏幕使用ies“查看”->“源”菜单选项来查看原始输出。

wfauudbj

wfauudbj7#

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

<?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没有测试它,但我相信它的工作。

9vw9lbht

9vw9lbht8#

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

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

eeq64g8w9#

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

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

要放在脚本的开头,正在进行故障排除。这是不完美的,完美的变种是,你也能在 php.ini 在php中记录错误以捕获语法和启动错误。
这里列出的设置显示所有错误、通知和警告,包括严格的错误、通知和警告,而不管是哪个php版本。
接下来要考虑的事项:
安装xdebug并使用ide启用远程调试。
另请参见:
错误报告(正确的方法)
预定义的constantsdocs error_reporting() 文件 display_errors 文件

ttcibm8c

ttcibm8c10#

为了保持这种状态并使其更容易理解,您可以编辑php.ini文件。通常储存在 /etc/php.ini 或者 /etc/php/php.ini ,但更具地方性 php.ini 的可能会覆盖它,具体取决于宿主提供商的设置准则。检查a phpinfo() 文件 Loaded Configuration File 在最上面,确定哪一个最后上膛。
搜索该文件中的显示错误。应该只有3个示例,其中2个是注解的。
将未注解行更改为:

display_errors = stdout
jvlzgdj9

jvlzgdj911#

php配置

php.ini中的2个条目指示错误的输出:
display_errors error_reporting 在生产中, display_errors 通常设置为 Off (这是一件好事,因为在生产站点中显示错误通常是不可取的!)。
然而,在发展中,它应该被设定为 On ,以便显示错误。检查! error_reporting (从PHP5.3开始)默认设置为 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (也就是说,除了通知、严格标准和弃用通知之外,所有内容都会显示出来)。如果有疑问,请将其设置为 E_ALL 显示所有错误。检查!

哇,哇!没有支票!我无法更改我的php.ini!

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

运行时配置

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

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

这两行的效果与上面修改php.ini条目的效果相同!令人惊叹的!

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

那意味着剧本还没开始呢!这通常发生在你有语法错误的时候!
由于语法错误,脚本甚至无法进入运行时。它在编译时失败,这意味着它将使用php.ini中的值,如果没有更改,可能不允许显示错误。

错误日志

另外,php默认记录错误。在共享托管中,它可能位于专用文件夹中,也可能与违规脚本位于同一文件夹中。
如果您有权访问php.ini,可以在 error_log 进入。

oprakyz7

oprakyz712#

可以注册一个钩子来显示最后一个错误或警告。

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

register_shutdown_function('shutdown');

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

mwngjboj

mwngjboj13#

我推荐内特·特拉

xyhw6mcr

xyhw6mcr14#

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

此外,可以使用xdebug获得更详细的信息。

eimct9ow

eimct9ow15#

以下选项启用所有错误:

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

另请参见以下链接
http://php.net/manual/en/errorfunc.configuration.php#ini.display-错误
http://php.net/manual/en/errorfunc.configuration.php#ini.display-启动错误
http://php.net/manual/en/function.error-reporting.php

相关问题