死亡白屏:致命错误:允许的X字节内存耗尽


21

我的Drupal安装有问题,例如:

  • 当我启用或禁用模块时,它会将我重定向到空白页,
  • 当我创建一个新的内容类型并将其保存时,将我重定向到空白页面,
  • 当我添加新视图并保存时,它会将我重定向到空白页面,
  • 当我尝试清除缓存时,它会将我重定向回空白页,
  • 或类似情况。

基本上所有确认页面都会将我重定向到白屏。当我再次刷新它时,它会显示该页面。我试图增加PHP内存值,但没有帮助。

还有其他解决方案吗?

我遇到的错误:

致命错误:在线1上的site / all / modules / views / plugins / views_plugin_localization_none.inc中的100663296字节已用尽的内存大小(尝试分配8192字节)


2
始终检查错误日志,它将获取所有需要的信息。听起来好像您的内存不足了。Drupal 7需要超过32MB的内存,许多主机提供商已将其设置为默认值。
2012年

Answers:


20

我知道这可能会晚了,但这对我有所帮助。大多数情况下,模块导致WSOD时,我不能只是禁用模块来测试它是什么,因为在此过程中我可能丢失了数据。我要做的是module.inc在核心includes目录的中临时编辑此功能

function module_invoke_all($hook) {
  $args = func_get_args();
  // Remove $hook from the arguments.
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {

        print "Starting loading $module <br />";

        $function = $module . '_' . $hook;
        if (function_exists($function)) {
          $result = call_user_func_array($function, $args);
          if (isset($result) && is_array($result)) {
            $return = array_merge_recursive($return, $result);
          }
          elseif (isset($result)) {
            $return[] = $result;
          }
        }

        print "Finished loading $module <br />";

  }

  return $return;
}

我在上面的代码中添加了这2条print语句,然后刷新页面,未到达“完成加载$ module”语句的模块就是有问题的那个...在我的情况下是开发的。

找到模块后,您可以进入系统表并查找该模块,将其状态设置为0并引导= 0或运行查询:

UPDATE system SET status = 0, bootstrap = 0 WHERE name = 'module_name' LIMIT 1

参考:调试Drupal死亡白屏(WSOD)


1
将打印语句添加到module_invoke_all使我能够快速找到有问题的模块。然后我用drush禁用它。真是救命!
Dan Meigs 2014年

不客气@DanMeigs。我仅在今天才使用此方法来修复我的博客cleverlogic.net。也许我确实应该写一篇文章,因为我肯定在尝试修复
WSOD

11

将此代码粘贴到index.php文件中。它会显示错误消息,而不是空白页。至少可以知道问题的根源。将其粘贴在php标签之后。

    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);

希望它能为您指明道路!

http://drupal.org/node/158043


1
那没有用,我昨天尝试过尝试以查看错误,但没有显示任何内容
Jayaram 2012年

3
您检查过错误日志了吗?如果您在Linux上运行Apache,请在终端中尝试以下命令:tail /var/log/apache2/error.log。这将向您显示该文件的最近10行。
Charlie Schliesser 2012年

实际上,它开始向我显示错误。我得到的错误是致命错误:*** / sites / all / modules / views / plugins / views_plugin_localization_none.inc中允许的100663296字节内存耗尽(尝试分配8192字节)。 1号线
Jayaram

1
将其添加到index.php是一个坏主意(即使是临时的,因为大多数人会懒惰地稍后将其删除),最好直接将其粘贴到您的设置文件中。
kenorb

10

黑屏白屏死机的原因是错误报告已关闭,要检查错误,请在setting.php文件中添加以下几行:

error_reporting(E_ALL);
$conf['error_level'] = 2;
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

对于您面临的错误(“允许的XXX字节内存容量已耗尽”),您可以尝试以下操作:

  1. 手动截断缓存并检查它是否解决了问题(在这样做之前备份数据库可能是一个好习惯):

    Access phpMyAdmin and truncate all tables starting by cache_ from the database

  2. 通过在settings.php文件中ini_set('memory_limit', '-1');
    添加以下行来增加内存限制(因为上述错误的主要原因是服务器耗尽了内存,这导致了模块的部分加载,并导致了问题): 添加ini_set('memory_limit', '-1'); 覆盖默认的PHP内存限制。
    如果要限制内存,则-1可以提供诸如“ 256M”或“ 512M”之类的内存大小。


6

很有可能是您的一个模块内存不足。

您可以在index.php文件中添加一行代码,以允许Drupal在比默认设置更多的内存下运行:

ini_set('memory_limit','256M');

在/drupal/index.php文件中的?php之后的行上添加以上代码。如果一切正常,那么您可以确定导致内存问题的原因(很可能是模块)。

禁用模块,然后注释掉ini_set('memory_limit','256M'); 看看现在是否加载。

不建议离开ini_set('memory_limit','256M'); 作为解决方案,但它至少可以使您进入模块列表页面。

您可能会发现执行debug_backtrace()来确定使用内存的内容很有帮助。


这没有帮助
Jayaram 2012年

另外,我可以看到模块列表页面,它仅在启用/禁用模块时发生,我将不得不再次刷新以查看确认页面。
Jayaram

2
而不是将ini_set()调用放入index.php中,因为它们将在更新时消失,如果必须使用PHP进行编码,则应将它们放入settings.php文件中,这是特定于站点的正确位置覆盖。
阿尔弗雷德·阿姆斯特朗

将其添加到index.php是一个坏主意(即使是临时的,因为大多数人会懒惰地稍后将其删除),最好直接将其粘贴到您的设置文件中。
kenorb

6

错误:

致命错误:允许的X字节内存大小已用尽(尝试分配Y字节)

要将字节X转换为MB,除以1024 * 1024或在Wolfram处检查。

当PHP尝试分配Y字节,但由PHP memory_limit配置设置设置的X字节有硬限制时,会发生这种情况。

可以通过转到管理»报告»状态报告»PHP(URL:)/admin/reports/status/php或通过ini_get('memory_limit')使用PHP 打印来检查当前限制(请注意,UI和CLI的限制是不同的)。

为了修复它,您需要降低资源使用率,例如:

  • 禁用当前不使用的任何开发模块(推荐),

    这包括:开发,开发主题(如果启用)。

  • 禁用所有您不使用的模块,

  • 禁用某些可能影响您的内存资源的调试变量,例如drush

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • 禁用某些PHP扩展,例如XDebug,

  • 启用redis / memcached缓存和一些PHP缓存(例如OPCache / XCache),
  • 最后如果以上情况不能帮助- 增加memory_limit您的PHP配置

如果您决定增加内存限制,那么很多人建议通过将PHP代码粘贴到您的主机中index.php来增加您的PHP内存,从而实际入侵您的内核- 绝对不要这样做!这是非常糟糕的做法。

而是编辑您的settings.php(或settings.local.php如果包含的话)并在其末尾粘贴以下代码:

ini_set('memory_limit', '512M');

或更有效的方法是编辑PHP配置文件(php.ini)并更改以下行:

memory_limit = 512M  ; Maximum amount of memory a script may consume

如果您不确定自己的位置php.ini,请通过以下方式进行检查:

  • drush status 命令
  • 或前往/admin/reports/status/php

要进一步调查哪些页面/组件使用的内存最多,您可以采用以下几种方法:

有关更多信息,请检查:


1
+1强调php UI和CLI可以具有不同的memory_limit。我报告的问题仅drush是因为我有一个错误,/etc/php/7.0/cli/php.ini但没有/etc/php/7.0/cli/php.ini,所以drupal UI运行正常。谢谢!
米罗·马奇

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.