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

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

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

是否有一种方法可以让PHP像Java那样产生有用的错误消息?

671933 次浏览

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

php_flag  display_errors        on
php_value error_reporting       2039

您可能需要考虑使用E_ALL的值(Gumbo提到过)在您的PHP版本error_reporting中获取所有错误。# EYZ1

(1)您可以检查错误日志文件,因为它将有所有的错误(除非日志记录已被禁用)。(2)添加以下两行代码将帮助您调试非语法错误:

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

(3)另一种选择是使用编辑器在你输入时检查错误,例如php。PhpEd还提供了一个调试器,可以提供更详细的信息。(PhpEd调试器与xdebug非常相似,并直接集成到编辑器中,因此您可以使用一个程序来完成所有工作。)

卡特曼的链接也很不错:http://www.ibm.com/developerworks/library/os-debug/

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

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_reportingE_ALL | E_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,设置为On:

display_errors = "On"

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

display_errors = "stderr"

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

要打开完整的错误报告,请在脚本中添加以下内容:

error_reporting(E_ALL);

这甚至会导致出现最小的警告。还有,以防万一:

ini_set('display_errors', '1');

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

除了error_reporting和display_errors 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,因此不会显示。

所以"tail -f"你的日志文件,当你得到一个空白屏幕使用IEs "view" -> "source"菜单选项来查看原始输出。

尝试在实际的php文件中设置错误报告级别。或者,像其他人建议的那样,检查你的服务器设置——可能是php.ini中的一些东西,或者是关于你的主机的一些限制。不要仅仅依赖于。htaccess。此外,在排除故障时,print_r任何您认为可疑的变量。

你确定PHP实际上是从。htaccess中获取“display_errors”设置吗?检查phpinfo()函数的输出以确保这一点。

此外,你应该检查确保你没有使用'@',如果你使用了'@include…'或'@some_function(…)',在堆栈跟踪的某处。

如果错误是在PHP代码中,您可以在代码中使用error_reporting()函数来设置为报告所有。

但是,这并不能处理PHP崩溃的情况。这方面的信息只能在服务器日志中找到。也许你无法访问这些,但我合作过的许多托管提供商都有某种方式让你访问它。例如,我最喜欢的方法是在.php所在的当前目录中创建error_log文件。尝试在那里搜索或联系您的主机提供商。

一些应用程序确实自己处理这些指令,通过调用这样的命令:

error_reporting(E_ALL & ~E_DEPRECATED); or error_reporting(0);

从而覆盖你的。htaccess设置。

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

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

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

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

编辑以显示APPLICATON_LIVE

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/


if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
define('APPLICATION_LIVE', false);
} else {
die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
// Log or take other appropriate action.
}




/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");


if ( ! APPLICATION_LIVE ) {
// A few changes to error handling for development.
// We will want errors to be visible during development.
ini_set ( "display_errors", "1");
ini_set ( "display_startup_errors", "1");
ini_set ( "html_errors", "1");
ini_set ( "docref_root", "http://www.php.net/");
ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
ini_set ( "error_append_string", "</div>");
}

在代码中使用@inexistent_function_call();将导致解释器悄然死亡并中止脚本解析。您应该检查无效的函数,并尽量不要使用错误抑制操作符(@ char)

打开你的php.ini, 确保它被设置为:

display_errors = On

重新启动服务器。

下面将启用所有错误:

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

请参见以下链接

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

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

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

要持久保存并使其符合要求,可以编辑php.ini文件。它通常存储在/etc/php.ini/etc/php/php.ini中,但更多的本地php.ini可能会覆盖它,这取决于主机提供商的设置指南。检查phpinfo()文件顶部的Loaded Configuration File,以确保最后加载哪个文件。

在该文件中搜索display_errors。应该只有3个实例,其中2个是注释的。

将未注释的行更改为:

display_errors = stdout

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

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

放在正在进行故障排除的脚本的开头。这并不完美,完美的变体是在php.ini中启用该功能,并在PHP中记录错误以捕获语法和启动错误。

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

接下来要考虑的事情:

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

也可以看到:

在页面顶部选择一个参数

error_reporting(E_ERROR | E_WARNING | E_PARSE);

打开错误报告是正确的解决方案,但是它似乎不会在打开它的程序中生效,而只会在随后包含的程序中生效。

因此,我总是创建一个文件/程序(我通常称之为“genwrap.php”),它的代码本质上与这里流行的解决方案相同。打开错误报告),然后它还包括我实际想要调用的页面。

实现这个调试有两个步骤;

一个 -创建genwrap.php并将以下代码放在其中:

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


include($_REQUEST['page']);
?>

两个 -更改到你想调试的程序/页面的链接,通过genwrap.php,

例如:改变:

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

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

下面的代码应该显示所有错误:

<?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提供了一些更好的方法来了解开发人员为什么以及他们的代码在哪里出错,因此通过了解这些错误,开发人员可以在许多方面改进他们的代码。

最好的方法是在脚本顶部写以下两行来获得所有错误消息:

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

在IDE中使用xdebug之类的调试器工具的另一种方法。

PHP配置

php . ini中的2个条目指示错误的输出:

  1. display_errors
  2. error_reporting

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

但是,在发展中,它应该设置为On,以便显示错误。# EYZ2 !

error_reporting(从PHP 5.3开始)默认设置为E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(意思是,除了通知、严格标准和弃用通知之外的所有内容都会显示)。当有疑问时,将其设置为E_ALL以显示所有错误。# EYZ4 !

哇哇!没有检查!我不能改变我的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条目下找到它。

你需要从PHP中获取有用错误的两行关键代码是:

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

正如其他贡献者所指出的那样,出于安全原因,这些功能在默认情况下是关闭的。作为一个有用的技巧——当你设置你的网站时,为你的不同环境做一个切换是很方便的,这样在你的本地和开发环境中,这些错误默认是打开的。这可以通过以下代码实现(理想情况下是在index.php或配置文件中,这样从一开始就处于活动状态):

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和其他语法错误。

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

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

如果你是一个ubuntu用户,那么在你的终端上运行这个命令

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

,它将显示最近的50个错误。 apache2的错误文件error.log记录了所有的错误

除了上面的许多很好的答案,你还可以在你的项目中实现以下两个功能。它们将在应用程序/脚本退出之前捕捉每个非语法错误。 在函数内部,您可以进行回溯和记录,或向公众呈现令人愉快的'网站正在维护'消息

致命错误:

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

我建议使用Nette特雷西来更好地显示PHP中的错误和异常:

Nette Tracy截图

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

重要的是要认识到语法错误或解析错误发生在编译解析步骤中,这意味着PHP甚至在有机会执行任何代码之前就会崩溃。因此,如果你在运行时修改PHP的display_errors配置(这包括在代码中使用ini_set到使用.htaccess,这是一个运行时配置文件),那么只有默认的加载配置在发挥作用。

如何在开发中始终避免WSOD

为了避免WSOD,你要确保你的加载的配置文件display_errorserror_reporting设置为-1 (这是等价的E_ALL,因为它确保所有位都是打开的,不管你运行的是哪个版本的PHP)。不要硬编码E_ALL的常量值,因为该值在不同版本的PHP之间可能会发生变化。

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

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

要定位您加载的配置文件,只需用以下代码创建一个新的PHP文件…

<?php
phpinfo();

然后将浏览器指向那里,查看加载的配置文件解析了其他.ini文件,它们通常位于phpinfo()的顶部,将包含所有已加载配置文件的绝对路径。

如果您看到的是(none)而不是文件,这意味着在配置文件(php.ini)路径中没有php.ini。因此,您可以从这里下载与PHP捆绑的PHP .ini并将其复制到配置文件的php.ini路径,然后确保您的php用户有足够的权限从该文件读取。您需要重新启动httpd或php-fpm来加载它。记住,这是与PHP源代码捆绑在一起的发展 PHP .ini文件。所以请不要在生产中使用它!


只是不要在生产中这样做

这确实是在开发过程中避免WSOD的最佳方法。任何人建议你把ini_set('display_errors', 1);error_reporting(E_ALL);放在你的PHP脚本的顶部,或者像你在这里所做的那样使用.htaccess,都不会帮助你避免当语法或解析错误发生时(就像你在这里的情况),如果你加载的配置文件关闭了display_errors

许多人(以及PHP的常规安装)将使用默认关闭display_errors的production-ini文件,这通常会导致您在这里遇到的相同挫折。因为PHP在启动时已经关闭了它,然后遇到语法或解析错误,并且没有任何输出。您希望PHP脚本顶部的ini_set('display_errors',1);能够避免这种情况,但是如果PHP无法解析您的代码也没关系,因为它永远不会到达运行时。

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

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


register_shutdown_function('shutdown');

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

您还可以像这样在终端(命令行)中运行文件:php -f filename.php

这将运行您的代码并为您提供相同的输出,以防您在error.log中看到的任何错误。它提到了错误和行号。

对于那些使用nginx,即使是<?php echo 123;文件也有白色屏幕的人。在我的情况下,我在nginx配置文件中没有这个必要的PHP选项:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_params文件中没有这个选项,所以PHP不起作用,日志中也没有任何错误。

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

除了这里所有精彩的答案,我还想特别提一下MySQLi和PDO库。

为了……

  1. 总是看到数据库相关的错误,和
  2. 避免检查方法的返回类型以查看是否出现了错误

最好的选择是将库配置为抛出异常

MySQLi

将此添加到脚本顶部附近

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

最好放在使用new mysqli()mysqli_connect()之前。

PDO

在连接实例上将PDO::ATTR_ERRMODE属性设置为PDO::ERRMODE_EXCEPTION。你可以在构造函数中这样做

$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

或者在创造之后

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

这个答案是由冗余部门为您带来的。

  1. < p > # EYZ1

    设置display_errorserror_reporting现在已经被充分覆盖。但我要重申一下什么时候该使用哪个选项:

    • ini_set()error_reporting()仅适用于运行时错误。
    • php.ini应该主要针对开发设置进行编辑。(web服务器和CLI版本通常有不同的php.ini)
    • .htaccess标志只适用于过时的设置(找一个新的主机!管理良好的服务器更便宜。)
    • .user.ini是部分php.ini的现代设置(FCGI/FPM)

    作为运行时错误的粗略替代,你可以经常使用:

    set_error_handler("var_dump");   // ignores error_reporting and `@` suppression
    
  2. error_get_last()

    Can be used to retrieve the last runtime notice/warning/error, when error_display is disabled.

  3. $php_errormsg

    Is a superlocal variable, which also contains the last PHP runtime message.

  4. isset() begone!

    I know this will displease a lot of folks, but isset and empty should not be used by newcomers. You can add the notice suppression after you verified your code is working. But never before.

    A lot of the "something doesn't work" questions we get lately are the result of typos like:

    if(isset($_POST['sumbit']))
    #                  ↑↑
    

    如果你的代码中充斥着isset/empty/array_keys_exists,你将不会得到任何有用的通知。有时更多的是使用@是明智的,所以通知和警告至少会在日志中。

  5. < p > # EYZ1

    获取assert()节的警告。(相当不常见,但更熟练的代码可能包含一些。)

    PHP7在php.ini中也需要zend.assertions=1

  6. < p > # EYZ1

    将PHP转换为严格类型的语言并不会修复大量的逻辑错误,但它绝对是调试目的的一个选项

  7. < p > # EYZ0

    @Phil已经提到了PDO/MySQLi错误报告选项。当然,其他数据库api也存在类似的选项

  8. json_last_error() + json_last_error_msg

    用于JSON解析

  9. < p > # EYZ1

    regexen。< / p >

  10. < p > # EYZ0

    要调试curl请求,您至少需要CURLOPT_VERBOSE

  11. < p > # EYZ1

    同样,shell命令执行本身也不会产生错误。你总是需要2>&1和偷看$errno.

PHP错误处理

有时,您的应用程序不会按预期的方式运行,从而导致错误。有许多原因可能导致错误,例如:

Web服务器可能耗尽磁盘空间 用户可能在表单字段中输入了无效值 您试图访问的文件或数据库记录可能不存在 应用程序可能没有写入磁盘上文件的权限 应用程序需要访问的服务可能暂时不可用 这些类型的错误被称为运行时错误,因为它们发生在脚本运行时。它们不同于需要在脚本运行之前修复的语法错误

专业的应用程序必须能够优雅地处理此类运行时错误。通常,这意味着要更清楚、更准确地告知用户问题。

理解错误级别

通常,当出现阻止脚本正常运行的问题时,PHP引擎会触发一个错误。每个错误都由一个整数值和一个相关常数表示。下表列出了一些常见的错误级别:

enter image description here

PHP引擎在遇到脚本问题时触发错误,但是您也可以自己触发错误,以生成更用户友好的错误消息。这样可以使应用程序更加复杂。下面介绍PHP中处理错误的一些常用方法:

基本错误处理使用die()函数

<?php // Try to open a non-existent file
$file = fopen("sample.txt", "r");
?>
如果文件不存在,你可能会得到这样的错误: 警告:fopen(sample.txt)[函数。在C:\wamp\www\project\test.php第2行中没有这样的文件或目录

如果我们遵循一些简单的步骤,我们可以防止用户得到这样的错误消息:

<?php
if(file_exists("sample.txt")){
$file = fopen("sample.txt", "r");
} else{
die("Error: The file you are trying to access doesn't exist.");
}
?>

现在,如果您运行上面的脚本,您将得到如下错误消息:错误:您要访问的文件不存在。

正如您所看到的,通过在尝试访问文件之前实现一个简单的检查文件是否存在,我们可以生成一个对用户更有意义的错误消息。

上面使用的die()函数只是显示自定义错误消息,如果没有找到'sample.txt'文件,则终止当前脚本。

创建自定义错误处理程序

您可以创建自己的错误处理函数来处理PHP引擎生成的运行时错误。自定义错误处理程序为您提供了更大的灵活性和对错误的更好控制,它可以检查错误并决定如何处理错误,它可以向用户显示消息,将错误记录在文件或数据库中或通过电子邮件发送,尝试修复问题并继续执行,退出脚本执行或完全忽略错误。

自定义错误处理函数必须能够处理至少两个参数(errno和errstr),但是它可以选择接受额外的三个参数(errfile, errline和errcontext),如下所述:

enter image description here

下面是一个简单的自定义错误处理函数示例。这个处理程序customError()在发生错误时被触发,无论错误多么小。然后,它将错误的详细信息输出到浏览器,并停止脚本的执行。

<?php
// Error handler function
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
?>

您需要告诉PHP使用您的自定义错误处理函数—只需调用内置的set_error_handler()函数,并传入函数名。

<?php
// Error handler function
function customError($errno, $errstr){
echo "<b>Error:</b> [$errno] $errstr";
}
 

// Set error handler
set_error_handler("customError");
 

// Trigger error
echo($test);
?>

错误日志

在文本文件中记录错误消息

你也可以在日志文件中记录错误的详细信息,就像这样:

<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
$message = date("Y-m-d H:i:s - ");
$message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
$message .= "Variables:" . print_r($errcontext, true) . "\r\n";
    

error_log($message, 3, "logs/app_errors.log");
die("There was a problem, please try again.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>

触发错误

尽管PHP引擎在遇到脚本问题时会触发错误,但是您自己也可以触发错误。这有助于使您的应用程序更加健壮,因为它可以在潜在的问题变成严重错误之前标记出来。

要在你的脚本中触发一个错误,调用trigger_error()函数,传入你想要生成的错误消息:

trigger_error("There was a problem.");

考虑下面的函数,它计算两个数的除法。

<?php
function calcDivision($dividend, $divisor){
return($dividend / $divisor);
}
 

// Calling the function
echo calcDivision(10, 0);
?>

如果传递的值为0(0)作为$除数参数,PHP引擎生成的错误将类似于警告:在C:\wamp\www\project\test.php第3行除以0

这条消息看起来信息量不大。考虑以下示例,该示例使用trigger_error()函数生成错误。

<?php
function calcDivision($dividend, $divisor){
if($divisor == 0){
trigger_error("The divisor cannot be zero", E_USER_WARNING);
return false;
} else{
return($dividend / $divisor);
}
}
 

// Calling the function
echo calcDivision(10, 0);
?>

现在脚本生成这个错误消息:警告:C:\wamp\www\project\error.php第4行中的除数不能为零

正如您所看到的,与前一个示例相比,第二个示例生成的错误消息更清楚地解释了问题。

参考:# EYZ0

我用这样的方法解决了我的500个问题:

A.检查php.ini参数

  1. php . ini祝辞祝辞error_reporting = E_ALL | E_STRICT
  2. php . ini祝辞祝辞display_errors = On
  3. php . ini祝辞祝辞display_startup_errors =关闭

B.更新IIS管理器参数

  1. IIS经理>>错误页>>500年在祝辞编辑功能设置>>详细的错误

在这一步中,您将得到500个这样的错误,并且没有加载HTML。

enter image description here

  1. IIS经理>>FastCGI设置>>php-cgi.exe祝辞祝辞标准误差模式>>IgnoreAndReurn200

在这个步骤中,您可以看到HTML页面包含PHP错误,如下所示。 # EYZ0 < / p >

完成:)