为了账号安全,请及时绑定邮箱和手机立即绑定

PHP的死亡白屏

PHP的死亡白屏

PHP
跃然一笑 2019-05-21 16:10:15
PHP的死亡白屏现在我开始回到PHP,我开始记得为什么我放弃了它。目前我盘子里最烦人的事情就是我所说的“PHP的死亡白屏”。当PHP由于语法或其他原因而出现致命错误时,似乎总是在没有实际向浏览器发送任何内容的情况下死亡。我已将以下内容添加到我的中.htaccess,并且它似乎在大多数时间都有效,但在这些情况下它不起作用。php_value display_errors 1php_value display_startup_errors 1php_value error_reporting 2147483647 # E_ALL我错过了什么吗?目前我觉得我需要刷新我编写的每几行代码,以免我犯了一个错误,并且必须搜索许多页面,试图找出我犯的一个小错误......编辑:例如,给出以下两行代码:$foo = array(':language' => $languageId;$foo = array(':language' => $languageId);第一个将显示死亡的白色屏幕(即,什么都没有打印到浏览器),而第二个将愉快地执行。
查看完整描述

5 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

以下代码应显示所有错误:


<?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复制并粘贴了它,但我确信它有效。


查看完整回答
反对 回复 2019-05-21
?
慕标5832272

TA贡献1966条经验 获得超4个赞

我总是在php脚本的顶部使用这种语法。


ini_set('error_reporting', E_ALL);

ini_set('display_errors', 'On');  //On or Off


查看完整回答
反对 回复 2019-05-21
?
Qyouu

TA贡献1786条经验 获得超11个赞

可以注册一个钩子以使最后一个错误或警告可见。


function shutdown(){

  var_dump(error_get_last());

}


register_shutdown_function('shutdown');

将此代码添加到index.php的开头将帮助您调试问题。


查看完整回答
反对 回复 2019-05-21
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

这是加载与运行时配置的问题

重要的是要认识到在编译解析步骤期间发生语法错误或解析错误,这意味着PHP将在它甚至有机会执行您的任何代码之前保释。因此,如果您display_errors在运行时修改PHP的配置(这包括从使用ini_set代码到使用.htaccess,这是运行时配置文件),那么只有默认加载的配置设置正在运行。

如何始终避免开发中的WSOD

要避免使用WSOD,您需要确保已加载的配置文件display_errors打开并error_reporting设置为-1这是等效的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)加载的配置文件

要找到已加载的配置文件,只需使用以下代码创建一个新的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无法解析您的代码也无关紧要,因为它永远不会到达运行时。


查看完整回答
反对 回复 2019-05-21
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

错误和警告通常出现在....\logs\php_error.log....\logs\apache_error.log取决于您的php.ini设置。

有用的错误通常也会定向到浏览器,但由于它们不是有效的html,因此不会显示。

所以"tail -f“你的日志文件和当你得到一个空白的屏幕使用IE浏览器” - >“源”菜单选项来查看原始输出。


查看完整回答
反对 回复 2019-05-21
  • 5 回答
  • 0 关注
  • 930 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信