我经常会尝试运行PHP脚本,然后得到一个空白屏幕。没有错误信息;只有一个空屏幕。原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或者完全是其他原因。
很难找出哪里出了问题。我最终注释掉了代码,到处输入“echo”语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧?
是否有一种方法可以让PHP像Java那样产生有用的错误消息?
我经常会尝试运行PHP脚本,然后得到一个空白屏幕。没有错误信息;只有一个空屏幕。原因可能是一个简单的语法错误(错误的括号,缺少分号),或者函数调用失败,或者完全是其他原因。
很难找出哪里出了问题。我最终注释掉了代码,到处输入“echo”语句,等等,试图缩小问题的范围。但肯定有更好的办法,对吧?
是否有一种方法可以让PHP像Java那样产生有用的错误消息?
当前回答
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
其他回答
你确定PHP实际上是从。htaccess中获取'display_errors'设置吗?检查phpinfo()函数的输出以确定。
此外,你应该检查以确保你没有使用'@',如果你使用了'@include…'或'@some_function(…)',在堆栈跟踪的某处。
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);
此外,使用xdebug可以获得更详细的信息。
我推荐Nette Tracy来更好地可视化PHP中的错误和异常:
这是一个加载配置与运行时配置的问题
重要的是要认识到在编译或解析步骤中会发生语法错误或解析错误,这意味着PHP甚至在有机会执行任何代码之前就会退出。因此,如果你在运行时修改PHP的display_errors配置(这包括在代码中使用ini_set到使用.htaccess,这是一个运行时配置文件),那么只有默认加载的配置设置在起作用。
如何在开发中始终避免WSOD
为了避免WSOD,您需要确保加载的配置文件具有display_errors,并将error_reporting设置为-1(这相当于E_ALL,因为它确保无论您运行的是哪个版本的PHP,所有位都是打开的)。不要硬编码E_ALL的常量值,因为该值在不同版本的PHP之间可能会发生变化。
Loaded configuration is either your loaded php.ini file or your apache.conf or httpd.conf or virtualhost file. Those files are only read once during the startup stage (when you first start apache httpd or php-fpm, for example) and only overridden by runtime configuration changes. Making sure that display_errors = 1 and error_reporting = -1 in your loaded configuration file ensures that you will never see a WSOD regardless of syntax or parse error that occur before a runtime change like ini_set('display_errors', 1); or error_reporting(E_ALL); can take place.
如何找到你(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,就像你在这里所做的,不会帮助你避免WSOD当语法或解析错误发生时(就像你在这里的情况),如果你加载的配置文件已经display_errors关闭。
Many people (and stock installations of PHP) will use a production-ini file that has display_errors turned off by default, which typically results in this same frustration you've experienced here. Because PHP already has it turned off when it starts up, then encounters a syntax or parse error, and bails with nothing to output. You expect that your ini_set('display_errors',1); at the top of your PHP script should have avoided that, but it won't matter if PHP can't parse your code because it will never have reached the runtime.
尝试在实际的php文件中设置错误报告级别。或者,像其他人建议的那样,检查你的服务器设置——可能是php.ini中的一些东西,或者是关于你的主机的一些限制。不要仅仅依赖于。htaccess。此外,在排除故障时,print_r任何您认为可疑的变量。