-
16-09-2019 - |
题
现在,我开始重新进入PHP,我开始记得我为什么首先放弃了。我此刻板最讨厌的事情就是我来到术语“PHP的白色屏幕死亡”。当PHP得到一个致命的错误,由于语法或什么的,现在看来似乎永远没有实际发送任何内容到浏览器中死去。我已经添加下面我.htaccess
,它似乎工作的大部分时间,但它并没有在这些情况下工作。
php_value display_errors 1
php_value display_startup_errors 1
php_value error_reporting 2147483647 # E_ALL
我缺少的东西?目前,我觉得我需要刷新击中每一个代码几行我写,免得我犯了一个错误,并经历了许多的网页试图追查一个小错误我做搜索...
修改强>例如,给定的下面的两行代码:
$foo = array(':language' => $languageId;
$foo = array(':language' => $languageId);
在第一将表现出死亡的白色屏幕(即,什么都没有印刷到浏览器),而第二个将愉快地执行。
解决方案
错误和警告通常出现在....\logs\php_error.log
或....\logs\apache_error.log
取决于你php.ini设置。
同样有用的误差通常指向浏览器,但因为它们不是有效的HTML它们不被显示。
所以"tail -f
”你的日志文件,当你得到一个空白屏幕使用IE的‘查看’ - >‘源’菜单选项来查看原始输出
其他提示
下面的代码应显示的所有错误:
<?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脚本的最顶端。
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On'); //On or Off
可以注册一个钩,使最后的错误或警告可见。
function shutdown(){
var_dump(error_get_last());
}
register_shutdown_function('shutdown');
将此代码添加到你开始的index.php会帮你调试的问题。
这是与负载的运行时配置
出现问题要认识到,语法错误或解析过程中发生的错误是很重要的编译或解析一步,这意味着之前它甚至有机会执行PHP将保释您的任何代码。所以,如果你在运行时修改PHP的display_errors
配置,(这包括在你的代码中使用ini_set
使用的.htaccess,这是一个运行时配置文件什么),那么只有默认的加载配置设置在起作用
如何始终避免WSOD开发
要避免要确保您的加载配置文件已display_errors
并error_reporting
设置为-1
一个WSOD(这相当于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.ini文件)加载配置文件
要找到您加载配置文件(S)只需要创建一个新的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的股票安装)将使用生产ini文件有display_errors
默认关闭,这通常会导致你在这里经历过这种同样的挫折。因为PHP已经把手机关掉,当它启动时,再遇到语法或解析错误,并没事输出捞出。你希望你的ini_set('display_errors',1);
在你的PHP脚本的顶部应该避免的,但如果因为它永远不会达到运行PHP不能解析你的代码都不会有问题。
说不上它是否会有所帮助,但这里是一块用于PHP项目我的标准配置文件中。我倾向于不依赖于Apache的CONFIGS太多,甚至我自己的服务器上。
我从来没有消失的错误问题,所以也许在这里的东西会给你的想法。
<强>编辑显示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>");
}
打开你的php.ini, 确保它的设置为:
display_errors = On
重新启动服务器。
对于那些谁使用nginx的,有一个白色的屏幕,即使文件与<?php echo 123;
。在我来说,我没有对PHP这需要选项nginx的配置文件:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
这个选项是不是在fastcgi_params文件,因此PHP没有工作,有没有在日志中的任何错误。
尝试设置在实际的PHP文件的错误报告级别。或者,正如其他人的建议,请检查您的服务器设置 - 它可能是由于你方的主机东西在php.ini,或有一定的约束。不要只依靠的.htaccess。此外,故障排除,所有的print_r变量时,你可能会觉得腥。
您确定PHP实际上是捡“display_errors
”从的.htaccess设置?检查phpinfo()
函数的输出,以确保。
此外,你应该检查,以确保你没有使用“@
”,也可能是沉默你的错误,如果你已经使用“@包括...”或“@some_function(...)”的地方,向上堆栈跟踪。
某些应用程序处理这些指令本身,通过调用是这样的:
error_reporting(E_ALL & ~E_DEPRECATED); or error_reporting(0);
和由此覆盖你的.htaccess设置。
在代码中使用@inexistent_function_call();
将使intepreter静静死和中止脚本解析。您应该检查无效的功能,尽量不要使用错误supressing经营者(@字符)
我还发现这样的错误时,fastcgi_params
或fastcgi.conf
配置文件没有适当地包括在服务器配置。所以对我来说修复是一个愚蠢的:
include /etc/nginx/fastcgi_params;
花了我一个的小时的发现了...
您还可以运行在终端(命令行)的文件如下所示:。php -f filename.php
这运行你的代码,让您在你的error.log
看到任何错误的情况下相同的输出。它提到的错误和行号。
如果错误是在PHP代码,你可以用你的代码中的error_reporting()函数来设置该报告所有。
然而,这并不能处理的情况PHP崩溃时。这方面的消息仅在服务器日志可用。也许你没有获得这些,但许多托管服务提供商我合作过的有一些方法让你访问它。例如,我最喜欢的方法是,它会在那里驻留.PHP当前目录中的error_log文件。尝试搜索存在或与此有关的托管服务提供商。