现在,我开始重新进入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_errorserror_reporting设置为-1一个WSOD(这相当于E_ALL,因为它保证所有位被打开,无论其中的PHP版本的你正在运行的)。不硬编码E_ALL的恒定值,因为该值是受不同版本的PHP之间改变。

加载的配置是任意的加载php.ini文件或您apache.confhttpd.conf或虚拟主机文件。这些文件在启动阶段只读取一次(当你第一次启动apache httpd的或PHP-FPM,例如),并只能通过运行时配置更改覆盖。确保在您加载配置文件display_errors = 1error_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_paramsfastcgi.conf配置文件没有适当地包括在服务器配置。所以对我来说修复是一个愚蠢的:

include /etc/nginx/fastcgi_params;

花了我一个的小时的发现了...

您还可以运行在终端(命令行)的文件如下所示:。php -f filename.php

这运行你的代码,让您在你的error.log看到任何错误的情况下相同的输出。它提到的错误和行号。

如果错误是在PHP代码,你可以用你的代码中的error_reporting()函数来设置该报告所有。

然而,这并不能处理的情况PHP崩溃时。这方面的消息仅在服务器日志可用。也许你没有获得这些,但许多托管服务提供商我合作过的有一些方法让你访问它。例如,我最喜欢的方法是,它会在那里驻留.PHP当前目录中的error_log文件。尝试搜索存在或与此有关的托管服务提供商。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top