我经常会尝试运行PHP脚本,然后得到一个空白屏幕。没有错误信息;只有一个空屏幕。原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或者完全是其他原因。
很难找出哪里出了问题。我最终注释掉了代码,到处输入“echo”语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧?
是否有一种方法可以让PHP像Java那样产生有用的错误消息?
我经常会尝试运行PHP脚本,然后得到一个空白屏幕。没有错误信息;只有一个空屏幕。原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或者完全是其他原因。
很难找出哪里出了问题。我最终注释掉了代码,到处输入“echo”语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧?
是否有一种方法可以让PHP像Java那样产生有用的错误消息?
当前回答
尝试在实际的php文件中设置错误报告级别。或者,像其他人建议的那样,检查你的服务器设置——可能是php.ini中的一些东西,或者是关于你的主机的一些限制。不要仅仅依赖于。htaccess。此外,在排除故障时,print_r任何您认为可疑的变量。
其他回答
尝试在实际的php文件中设置错误报告级别。或者,像其他人建议的那样,检查你的服务器设置——可能是php.ini中的一些东西,或者是关于你的主机的一些限制。不要仅仅依赖于。htaccess。此外,在排除故障时,print_r任何您认为可疑的变量。
你需要从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;
}
除了这里所有精彩的答案,我还想特别提一下MySQLi和PDO库。
为了……
总是看到数据库相关的错误,和 避免检查方法的返回类型以查看是否出现了错误
最好的选择是将库配置为抛出异常。
MySQLi
将此添加到脚本顶部附近
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
最好放在使用新的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);
除了上面的许多很好的答案,你还可以在你的项目中实现以下两个功能。它们将在应用程序/脚本退出之前捕捉每个非语法错误。 在函数内部,您可以进行回溯和日志,或向公众呈现令人愉快的“网站正在维护”消息。
致命错误:
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
你确定PHP实际上是从。htaccess中获取'display_errors'设置吗?检查phpinfo()函数的输出以确定。
此外,你应该检查以确保你没有使用'@',如果你使用了'@include…'或'@some_function(…)',在堆栈跟踪的某处。