增加内存限制对致命错误无济于事:416行上的…/ modules / views / views.module允许的内存大小


11

三周前我已经从Drupal 7.14切换到7.15,因此,我遇到了一系列非常复杂的内存限制错误(对我而言)。每当我尝试清除性能缓存或运行更新脚本时,都会发生这些错误。

我的托管公司已将php.ini中的内存限制增加到126 M,256 M,512 M甚至1024M。但是仍然会发生错误。我已经将网站从共享迁移到了VPS,但是仍然会出现错误。我没有办法,也不知道如何前进。

错误如下:

  • 致命错误:416行/home/example/public_html/sites/all/modules/views/views.module中的536870912字节已用尽的内存大小(尝试分配30字节)
  • 致命错误:在第2736行的/home/example/public_html/includes/menu.inc中,耗尽了536870912字节的允许内存大小(尝试分配108字节)

  • 致命错误:第59行的/home/example/public_html/sites/all/modules/chain_menu_access/chain_menu_access.module中的536870912字节已用尽的内存大小(试图分配71字节)

  • 在第93行的/home/example/public_html/sites/all/modules/views/includes/base.inc中分配64个字节)


您的峰值流量是多少(页/秒)。视图还试图获取多少数据(节点?)?
cherouvim 2012年

关于drupal.org的类似讨论drupal.org/node/76156
Anoop Joseph

2
您是否偶然有一个返回大量结果的视图,并且对于格式,它加载内容而不是字段?我之前已经多次看到这种阻碍性能。
Jepedo

嗨,大家好!非常感谢您的回答。我要说的是网站处于维护模式,仅包含少量内容(节点)用于测试。该站点仅由爬虫访问。正如我在帖子中提到的那样,在节点drupal.org/node/76156中建议的php.ini解决方案中增加内存限制对我的情况没有帮助。对于加载内容而不是字段的视图。我想弄清楚如何
salift 2012年

1
您是否尝试过切换回Drupal 7.14?如果升级到Drupal 7.15导致了该问题,那么为什么不尝试切换回去呢?我的直觉是您的模块之一中存在无限递归。您与“视图”相关的模块是什么?
Johnathan Elmore

Answers:


13

上一次我遇到Drupal内存问题时也一直在墙上碰头。这是我收集的有关该主题的知识:

1.视图(可以)使用大量内存

我爱我一些Views(以及Panels和CTools,以及merlinofchaos用他强大的手指触摸到的所​​有东西),但是可以创建具有大量内存的多个关系的配置。如果禁用视图,并且内存问题消失了,则可能是结构不良的视图导致了该问题。

如果它是一个视图,并且您确实需要该视图才能工作,该怎么办?尝试将其放入代码中(通过批量导出器或功能;请参见下文。我已经手动编码类似Views的功能,以提高性能但收效甚微)。另一个想法是以另一种方式重做视图-如果最终要获得的是分类术语,则在创建视图时请确保该视图的类型为分类视图;请勿创建使用关系获取分类术语的内容视图。

在这里还值得一提的是,Panels还应该使用很多内存-我尚未对其进行基准测试,因此无法确认。

2.将资料从数据库转移到代码中是一种很好的做法

我花了几个Drupal站点来实现这一点,但是将通过UI创建的所有内容(特别是视图和面板配置)保留在数据库中是Drupal的最差做法。为什么?它增加了数据库的负载,并且无法进行版本控制。第一点在内存使用方面尤其成问题-站点不仅必须从数据库中的View加载内容,而且还必须加载View组件本身。Drupal如何使用表会加剧这种情况:通过将所有内容抽象到第n级,Drupal功能的每一位都会使用一个新表,从而导致一些请求将一个兆兆表连接在一起。这给计算机科学界的人们带来了烦恼(注意:链接很愚蠢),但是像Drupal那样模块化和用户友好的软件是无法避免的。

解决方案?使用批量导出程序(CTools附带)或功能部件可以将数据库中当前驻留的部分代码打包为模块代码。

3.主题也可以吃掉记忆

您的主题是否有很多模板文件(即,主题名称/ templates /中的文件)?如果是这样,则每次加载其中一个文件时都会消耗内存。如果要专门创建模板来抑制显示Drupal的位,请尝试以下任一方法:

  1. 更改权限,以使特定的非管理员用户角色不会显示该权限。
  2. 使用CSS隐藏元素。

显然,第一个选择是您要为影响安全性的事情做些什么-您不想使用CSS为某些用户隐藏“编辑”按钮,只是让他们随后通过Firebug或其他方法取消隐藏。

4.不要在contrib模块上落伍

虽然有时一个站点需要很多contrib模块,但不要太过分。每个启用的(注:已启用。禁用的模块不使用任何内存)模块都使用内存。这是显而易见的,但值得注意的是。

5. VPS(有时)是一个谎言

以我的经验,一些不道德的托管公司喜欢尝试将Drupal网站推送到VPS服务器-它们更昂贵,并且可以为更多的WordPress网站释放共享托管空间。由于Web主机通常不通告(或什至乐意告诉您)共享主机的最大内存限制,这一事实使情况更加恶化。

las,通常情况下,如果一个站点的通信量不大并且仍然崩溃,那么问题可能与Drupal的配置有关。将用户推向VPS只会使人感到困惑,并增加了要处理的变量(是Web服务器配置?PHP配置?VPS来宾配置?甚至是VPS主机配置)。

6.当所有其他方法均失败时,克隆到localhost并用木棍击败它

这是人们使用带有版本控制功能的dev-staging-production方法的重要原因-当所有其他方法都失败时,您可以执行数据库转储,将站点克隆到本地测试服务器,然后在站点上将站点弄乱。测试服务器而不必担心实际破坏生产服务器上的任何东西。

对于内存问题,这通常意味着逐个禁用模块,直到暴露导致问题的模块为止。它还可能指向与虚拟主机相关的问题-如果该站点在本地安装上运行得很好,并且内存设置为合理的128MB,那么您知道您的虚拟主机已经崩溃。

tl; dr

我的直觉是导致问题的原因是chain_menu_access。尝试禁用它并清除缓存,看看它是否有效。

当我想到要尝试的其他方法时,我还将添加此答案。


...而这正是我在悬赏这个问题时所希望的那种事情!特别是2. 110回复您的好先生:)希望这也能吸引其他经验稍有不同的人提供有用的意见
user56reinstatemonica8 2012年

ps我在很多地方都听说过,即使禁用的模块在解析文件时也会占用一定的内存。我见过有人说,所有的php / inc文件都以某种方式进行了解析,尽管这似乎不正确(很可能只是信息文件)。知道这有什么道理吗?
user56reinstatemonica8

太好了,谢谢!我很确定Drupal在加载文件时会非常注意内存-如果运行XHProf,则是要file_scan_directory用完足够内存的调用次数。不过,我将用devel进行测试,以确认这一点。
aendrew

如果禁用的模块使用任何内存,那将是微不足道的。我查看了Devel在删除模块之前和之后报告的内存量-删除文件后的页面刷新显示了一个小的(<1MB)峰值,然后在下一次刷新时它完全返回到删除前的值。这使我相信Drupal a。在启动时扫描modules目录,以查看是否有任何新的.info文件。将模块的详细信息添加到其system表c。加载任何将system.status字段条目设置为的模块1。如果有人可以确认或反对,我将不胜感激。
aendrew

2

您可以尝试将PHP探查器(例如XHProf或Xdebug的内置探查器)放入请求中,以检查正在发生的情况。


一旦弄清了哪些部分特别需要完成第一步的内存量,第二步实际上就是试图了解为什么要使用那么多的内存以及如何减少内存。上面的人们谈论结果中的很多项目等等。通常,这是一个过程,不能简单描述。
Daniel Wehner

1

视图是一个记忆猪。Drupal的缓存可以提供帮助。Drupal仅在模块创建表或具有其他可悬空对象的情况下才激活模块。仅卸载将删除大多数工件。我们使用drupal的授权/权限,并在其中编写自己的模块。不是最好的,但性能要好得多,更容易调整。我们也对WP做同样的事情。


0

我的情况是内存限制问题是由缓存系统(Boost和Boost Expire模块)生成的。这给了我更新模块或视图的问题。禁用Boost模块后,所有模块都可以正常工作。

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.