Я получаю частую, прерывистую ошибку от модуля Advanced Forum, которая вызывает ошибку 500 при ее возникновении (WSOD). На производстве это происходит примерно 20 раз в час, примерно на 2-3% всех загрузок страницы форума в час. Это постоянно прерывисто . Локально, я не могу последовательно воспроизвести ошибку, но это происходит.
Ошибка включена
Строка 232 сайтов / все / modules / contrib / advanced_forum / includes / core-overrides.inc`:
Вызов неопределенного метода 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 () не может найти представление, и объект не создается должным образом в обратной строке. Таким образом, проблема, похоже, связана с представлениями, иногда не зная, что представление существует. Это заставляет меня думать, что это проблема с крючком.
Где это начинает становиться странным, являются реализациями 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, и он будет загружен автоматически.
MODULENAME.views.inc должен находиться в каталоге, указанном ключом «путь», возвращаемом MODULENAME_views_api (), или в том же каталоге, что и файл .module, если «путь» не указан.hook_views_default_views()
Этот хук должен быть помещен в MODULENAME.views_default.inc, и он будет загружен автоматически. MODULENAME.views_default.inc должен находиться в каталоге, указанном ключом «путь», возвращаемом MODULENAME_views_api (), или в том же каталоге, что и файл .module, если «путь» не указан.
Я попытался разделить эти процедуры на правильные, казалось бы, файлы. Это привело к тому, что Views последовательно находил представление Advanced Forum (как указано, что оно появилось в списке GUI Views), но не видело плагин. Страницы в Advanced Forum работали нормально, но представления были пустыми, потому что они ссылались на плагин стиля, предоставленный Advanced Forum, который Views больше не видел.
Я предполагаю, что что-то упускаю из-за хуков Views, но я совершенно в тупике
- Стек: Drupal 7, Views (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. Проблема не возникает при возврате к стандартному кешу Drupal. Когда возникает проблема, для представлений существует только 2-4 записи в кэш, в отличие от 100+, когда кэш построен правильно. Посещение страницы списка представлений администратора приводит к тому, что кэш полностью создается, и проблема не возникает. Мне нужно проверить, если вы нажмете какую-либо страницу просмотра View, вызывающую проблему, или просто расширенный просмотр форума.
ОБНОВЛЕНИЕ 4 : Полезный пользователь на IRC предположил, что это может быть проблемой, связанной с проблемами состояния гонки кэша Представлений: 853864 , 1102252
Ответы:
Похоже, вы нашли правильный ответ от IRC. «Постоянно прерывистый» в моем опыте - это когда два источника заполняют кеш. Чаще всего это происходит, когда у вас есть сайт разработки и промежуточный / производственный сайт с разными базами кода, но с одной и той же базой данных. Кэши, предоставленные drupal, которые я прочитал для соединения с базой данных, поэтому информация о маршрутизации / функциях, которая кэшируется, будет загрязнять. Попадание на страницу admin / modules обновит кэш модуля и места, попадание на страницу списка admin / views очистит вашу ошибку, потому что она обновляет понимание представлений сайта с точки зрения вашего сайта, а не с точки зрения того, что конфликтует с вами.
Если у вас есть возможность администратора сервера, измените пароль к базе данных вашего сайта и пароль в файле settings.php, и посмотрите, что ломается. Ваши списки должны перестать быть испорченными, и то, что подделывает их, должно сломаться ... если они не связаны напрямую с вашим сайтом и не используют ваш файл settings.php.
Кроме того, убедитесь, что в вашем docroot нет нескольких установок модуля views.
источник