我从高级论坛模块收到一个频繁的间歇性错误,该错误在发生时会导致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视图页面,还是仅点击高级论坛视图。