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

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

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


当前回答

您可以启用完整的错误报告(包括通知和严格消息)。有些人觉得这太啰嗦了,但值得一试。在php.ini中设置error_reporting为E_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"

其他回答

您可以在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向日志报告错误。

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

ini_set() / php.ini / .htaccess / .user.ini The settings display_errors and error_reporting have been covered sufficiently now. But just to recap when to use which option: ini_set() and error_reporting() apply for runtime errors only. php.ini should primarily be edited for development setups. (Webserver and CLI version often have different php.ini's) .htaccess flags only work for dated setups (Find a new hoster! Well managed servers are cheaper.) .user.ini are partial php.ini's for modern setups (FCGI/FPM) And as crude alternative for runtime errors you can often use: set_error_handler("var_dump"); // ignores error_reporting and `@` suppression error_get_last() Can be used to retrieve the last runtime notice/warning/error, when error_display is disabled. $php_errormsg Is a superlocal variable, which also contains the last PHP runtime message. 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'])) # ↑↑ You won't get any useful notices if your code is littered with isset/empty/array_keys_exists. It's sometimes more sensible to use @, so notices and warnings go to the logs at least. assert_options(ASSERT_ACTIVE|ASSERT_WARNING); To get warnings for assert() sections. (Pretty uncommon, but more proficient code might contain some.) PHP7 requires zend.assertions=1 in the php.ini as well. declare(strict_types=1); Bending PHP into a strictly typed language is not going to fix a whole lot of logic errors, but it's definitely an option for debugging purposes. PDO / MySQLi And @Phil already mentioned PDO/MySQLi error reporting options. Similar options exist for other database APIs of course. json_last_error() + json_last_error_msg For JSON parsing. preg_last_error() For regexen. CURLOPT_VERBOSE To debug curl requests, you need CURLOPT_VERBOSE at the very least. shell/exec() Likewise will shell command execution not yield errors on its own. You always need 2>&1 and peek at the $errno.

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

致命错误:

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

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

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