我经常会尝试运行PHP脚本,然后返回黑屏。没有错误信息;只是一个空白的屏幕。原因可能是简单的语法错误(括号错误,分号丢失),函数调用失败或完全是其他原因。
弄清楚出了什么问题是非常困难的。我最终注释掉了代码,在各处输入“ echo”语句,等等,试图缩小问题的范围。但是肯定有更好的方法吧?
有没有办法像Java一样使PHP产生有用的错误消息?
T_PAAMAYIM_NEKUDOTAYIM
。或者,也许“必须是整数的实例,给定整数”。
我经常会尝试运行PHP脚本,然后返回黑屏。没有错误信息;只是一个空白的屏幕。原因可能是简单的语法错误(括号错误,分号丢失),函数调用失败或完全是其他原因。
弄清楚出了什么问题是非常困难的。我最终注释掉了代码,在各处输入“ echo”语句,等等,试图缩小问题的范围。但是肯定有更好的方法吧?
有没有办法像Java一样使PHP产生有用的错误消息?
T_PAAMAYIM_NEKUDOTAYIM
。或者,也许“必须是整数的实例,给定整数”。
Answers:
对于语法错误,您需要在php.ini中启用错误显示。默认情况下,这些功能是关闭的,因为您不希望“客户”看到错误消息。请查看 PHP文档中的此页面,以获取有关2个指令的信息:error_reporting
和display_errors
。display_errors
可能是您要更改的一种。如果您无法修改php.ini,也可以将以下行添加到.htaccess文件中:
php_flag display_errors on
php_value error_reporting 2039
您可能需要考虑将E_ALL的值(如Gumbo所述)用于您的PHP版本,error_reporting
以获取所有错误。更多信息
其他3个项目:(1)您可以检查错误日志文件,因为它将包含所有错误(除非已禁用日志记录)。(2)添加以下两行将帮助您调试不是语法错误的错误:
error_reporting(-1);
ini_set('display_errors', 'On');
(3)另一个选择是使用编辑器,例如PhpEd,在键入时检查错误。PhpEd还带有调试器,该调试器可以提供更多详细信息。(PhpEd调试器与xdebug非常相似,并且直接集成到编辑器中,因此您可以使用1个程序来完成所有工作。)
卡特曼的链接也很好:http://www.ibm.com/developerworks/library/os-debug/
E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE
。参见docs.php.net/manual/en/errorfunc.constants.php
以下启用所有错误:
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
另请参阅以下链接
ini_set
是字符串。
以下代码应显示所有错误:
<?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复制并粘贴了它,但是我确信它是可行的。
ShutdownHandler
。基本上,这是适当处理错误的权宜之计。
E_NOTICE
此功能中的错误?
错误和警告通常会出现在php.ini设置中....\logs\php_error.log
,....\logs\apache_error.log
具体取决于您的设置。
有用的错误通常也指向浏览器,但由于它们不是有效的html,因此不会显示。
因此,"tail -f
您的日志文件以及当您出现空白屏幕时,请使用IE的“视图”->“源”菜单选项来查看原始输出。
php_flag display_errors 1
。
php.ini中的 2个条目指示错误的输出:
在生产中,display_errors
通常设置为Off
(这是一件好事,因为通常不希望在生产现场显示错误!)。
但是,在开发中,应将其设置为On
,以便显示错误。检查!
error_reporting
(自PHP 5.3起)默认设置为E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
(意味着,所有内容均会显示,但声明,严格的标准和弃用声明除外)。如有疑问,请将其设置E_ALL
为显示所有错误。检查!
真可惜 通常,共享主机不允许更改其php.ini文件,因此,该选项令人遗憾地不可用。但是不要害怕!我们还有其他选择!
在所需的脚本中,我们可以在运行时更改php.ini条目!意思是,它将在脚本运行时运行!甜!
error_reporting(E_ALL);
ini_set("display_errors", "On");
这两行与上述更改php.ini条目的效果相同!太棒了!
这意味着脚本甚至没有运行!当您遇到语法错误时,通常会发生这种情况!
由于语法错误,该脚本甚至无法运行。它在编译时失败,这意味着它将使用php.ini中的值,如果未更改,则可能不会显示错误。
另外,PHP默认情况下会记录错误。在共享主机中,它可能与有问题的脚本位于专用文件夹中或同一文件夹中。
如果可以访问php.ini,则可以在error_log
条目下找到它。
有一个非常有用的扩展名为“ xdebug ”,它也可以使您的报告更好。
为了快速进行实用的故障排除,我通常建议在SO上执行以下操作:
error_reporting(~0); ini_set('display_errors', 1);
放在出现问题的脚本的开头。这并不完美,完美的变体是您还启用了,php.ini
并且在PHP中记录了错误以捕获语法和启动错误。
此处概述的设置显示所有错误,通知和警告,包括严格的错误,无论哪个PHP版本。
接下来要考虑的事情:
另请参阅:
可以注册一个钩子,以使最后的错误或警告可见。
function shutdown(){
var_dump(error_get_last());
}
register_shutdown_function('shutdown');
将此代码添加到index.php的开头将有助于您调试问题。
认识到语法错误或解析错误是在编译或解析步骤期间发生的,这一点很重要,这意味着PHP甚至在没有机会执行任何代码之前都会保释。因此,如果您display_errors
在运行时修改PHP的配置(包括从ini_set
代码中使用到使用.htaccess(运行时配置文件)的任何内容),则仅在默认情况下加载配置设置。
为了避免WSOD,您需要确保已加载的配置文件已display_errors
打开并error_reporting
设置为-1
(这是等效的E_ALL,因为它确保所有位都打开了,而不管您运行的是哪个PHP版本)。不要硬编码E_ALL的常量值,因为该值在不同版本的PHP之间可能会发生变化。
加载的配置或者是你的加载php.ini
文件或您apache.conf
或httpd.conf
或虚拟主机文件。这些文件在启动阶段(例如,当您第一次启动apache httpd或php-fpm时)仅被读取一次,并且仅被运行时配置更改覆盖。确保display_errors = 1
并error_reporting = -1
在已加载的配置文件中,确保您永远不会看到WSOD,无论在运行时更改(例如ini_set('display_errors', 1);
或error_reporting(E_ALL);
可能发生)之前发生的语法或解析错误如何。
要找到已加载的配置文件,只需使用以下代码创建一个新的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
关闭。
许多人(以及PHP的常规安装)将使用display_errors
默认情况下已关闭的production-ini文件,这通常会导致您在此遇到的同样沮丧。由于PHP在启动时已经将其关闭,因此遇到语法或解析错误,并且无法输出任何内容。您希望ini_set('display_errors',1);
您的PHP脚本顶部应避免这种情况,但是PHP无法解析您的代码并不重要,因为它永远不会到达运行时。
如果您超酷,则可以尝试:
$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%的错误,这不是问题。
$_SERVER['REMOTE_HOST']
检查客户端是否是您。
Dunno是否有帮助,但这是我的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>");
}
我建议使用Nette Tracy以更好地可视化PHP中的错误和异常:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
error_reporting(E_ALL | E_STRICT);
并在php.ini中打开显示错误
您可以在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');
要从PHP中获得有用的错误,您需要执行以下两条关键操作:
ini_set('display_errors',1);
error_reporting(E_ALL);
正如其他贡献者所指出的,出于安全原因,默认情况下将其关闭。作为有用的提示-在设置站点时,方便地针对不同的环境进行切换,以使这些错误在本地和开发环境中默认为ON。这可以通过以下代码来实现(最好在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;
}
如果您是Ubuntu用户,则转到终端并运行此命令
sudo tail -50f /var/log/apache2/error.log
它将显示最近的50个错误。error.log
apache2 有一个错误文件,其中记录了所有错误。
要打开完整的错误报告,请将其添加到脚本中:
error_reporting(E_ALL);
这甚至会显示最小的警告。并且,以防万一:
ini_set('display_errors', '1');
会强制显示错误。应该在生产服务器中将其关闭,但在开发时则不应将其关闭。
您可以启用完整的错误报告(包括通知和严格的消息)。有人觉得这太冗长,但是值得一试。设置error_reporting
为E_ALL | E_STRICT
您的php.ini。
error_reporting = E_ALL | E_STRICT
E_STRICT
将通知您不推荐使用的功能,并为您提供有关执行某些任务的最佳方法的建议。
如果您不希望收到通知,但发现其他消息类型有帮助,请尝试排除通知:
error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE
还要确保display_errors
已在php.ini中启用了该功能。如果您的PHP版本低于5.2.4,请将其设置为On
:
display_errors = "On"
如果您的版本是5.2.4或更高版本,请使用:
display_errors = "stderr"
除了error_reporting和display_errors ini设置之外,您还可以从Web服务器的日志文件中获取SYNTAX错误。在开发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