是什么导致视图始终但间歇地找不到高级论坛模块提供的视图?


15

我从高级论坛模块收到一个频繁的间歇性错误,该错误在发生时会导致500错误(WSOD)。在生产中,每小时大约发生20次,每小时可能占所有论坛页面加载量的2-3%。它始终断断续续的。在本地,我无法始终如一地重现该错误,但确实会发生。

错误发生

site / all / modules / contrib / advanced_forum / includes / core-overrides.inc`的232行:

调用未定义的方法stdClass :: preview()

问题在于Advanced_forum_get_topics()函数:

function advanced_forum_get_topics($tid, $sortby, $forum_per_page, $sort_form = TRUE) {
  $term = taxonomy_term_load($tid);
  drupal_add_feed('taxonomy/term/' . $tid . '/feed', 'RSS - ' . check_plain($term->name));

  // Views handles this page
  $view = views_get_view('advanced_forum_topic_list');
  $view->sort_form = $sort_form;

  return $view->preview('default', array($tid));

}

本质上,views_get_view()无法找到视图,并且未按预期在返回行上创建对象。因此,问题似乎在于Views有时不知道该视图的存在。这使我认为这是一个棘手的问题。

hook_views_default_views()和hook_views_plugins()的实现开始变得奇怪。根据views.api.php,hook_views_default_views()应该在一个名为MODULENAME.views_default.inc的文件中,hook_views_plugins()应该在一个名为MODULENAME.views.inc的文件中。但是,这两个文件都位于MODULENAME.views.inc文件中。

从views.api.php:

  • hook_views_plugins()
    该挂钩应放置在MODULENAME.views.inc中,它将被自动加载。
    如果未指定“ path”,则MODULENAME.views.inc必须位于由MODULENAME_views_api()返回的“ path”键指定的目录中,或与.module文件相同的目录中。

  • hook_views_default_views()
    该挂钩应放置在MODULENAME.views_default.inc中,它将被自动加载。如果未指定“ path”,则MODULENAME.views_default.inc必须位于由MODULENAME_views_api()返回的“ path”键指定的目录中,或与.module文件相同的目录中。

我尝试将这些例程拆分为看似正确的文件。这导致View始终找到Advanced Forum视图(如显示在Views GUI列表中所示),但看不到该插件。Advanced Forum中的页面运行良好,但是视图为空白,因为它们引用了Advanced Forum提供的样式插件,而Views不再可见。

我以为我缺少有关Views挂钩的信息,但我完全感到困惑。

  • 堆栈:Drupal 7,视图(7.x-3.3),CTools(7.x-1.0),高级论坛(7.x-2.0)
  • PHP FPM,APC,nginx,Redis
  • 我没有发现任何有帮助的事情

更新1:虽然我尚未解决根本原因,但看来确实禁用Redis并恢复为Drupal的默认基于数据库的缓存存储机制可以阻止此问题的发生。

更新2:我可以通过flushall在Redis中进行可靠地在本地复制该问题。查看论坛列表的首页加载将致命。第二页加载(以及所有后续加载)工作正常。更新:我必须打管理员视图列表页面以清除错误。

更新3:在进行进一步的故障排除时,该问题似乎是由于仅在使用Redis时清除缓存后才无法正确重建View缓存引起的。还原到标准Drupal缓存时,不会发生此问题。发生此问题时,视图仅存在2-4个缓存条目,而正确构建缓存时则为100个以上。访问管理员视图列表页面会导致完全构建缓存,并且不会发生此问题。我需要验证是点击导致该问题的任何View视图页面,还是仅点击高级论坛视图。

更新4:在IRC上一个有用的用户认为这可能是与浏览缓存竞争状态的问题一个问题:8538641102252


您是否尝试过在视图,工具或高级论坛队列中创建问题?在我看来,眼下的问题是“视图”或“高级论坛”当前是否支持redis?据我所知,Views使用关系查询语言(SQL)来构建它的显示。我不确定Redis(键值存储)的效果如何。这并不是真正的答案,但是,我个人不知道是否有答案。我还建议您联系有关此问题的Drupal IRC频道。祝好运。
业余咖啡师,2012年

有趣的设置在那里。
业余咖啡师,2012年

我仅使用Redis替代Drupal的缓存后端,因此它对Views 应该是透明的。我没有运气就贴了。drupal.org/node/1110688
贾斯汀

@amateurbarista这是万神殿Drupal。
贾斯汀

1
您可以尝试其他缓存后端吗?这可能会确定您是View还是Redis问题。
mpdonadio

Answers:


1

听起来您从IRC找到了正确的答案。根据我的经验,“持续断断续续”是当有两个来源填充缓存时。最常见的情况是,当您拥有一个开发站点和一个暂存/生产站点位于不同的代码库但具有相同的数据库时。我已经阅读了Drupal提供的缓存,用于连接到数据库,因此缓存的路由/功能信息将交叉污染。点击admin / modules页面将刷新模块缓存和位置,点击admin / views列表页面将清除您的错误,因为它刷新了您从站点角度(而不是与您冲突的角度)对站点视图的理解。

如果您具有服务器管理能力,请将密码更改为站点数据库的密码,并将密码更改为settings.php中的密码,然后看看有什么问题。您的列表应该停止被破坏,对其进行篡改的内容应该会被破坏...除非它直接连接到您的站点并使用settings.php文件。

另外,请检查以确保文档根目录中没有多个Views模块安装。

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.