Что приводит к тому, что представления последовательно, но периодически не могут найти представление, предоставляемое модулем расширенного форума?

15

Я получаю частую, прерывистую ошибку от модуля 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

Джастин
источник
Вы пытались создать проблему в очереди Views, Ctools или Advanced Forum? Мне кажется, что вопрос под рукой - это то, поддерживает ли Views или Advanced Forum в настоящее время redis? Насколько мне известно, Views использует реляционный язык запросов (SQL) для построения своих дисплеев. Я не уверен, насколько хорошо это будет работать с Redis (хранилище ключей). Это не совсем ответ, но лично я не знаю, есть ли ответ на этот вопрос. Я также рекомендую вам обратиться к IRC-каналам drupal по этому вопросу. Удачи.
бариста-любитель
Интересная настройка у вас там.
бариста-любитель
Я использую только Redis как замену для бэкэнда кеша Drupal, поэтому он должен быть прозрачным для Views. Я отправил, чтобы сделать без удачи. drupal.org/node/1110688
Джастин
@amateurbarista Это Пантеон Друпал.
Джастин
1
Вы в состоянии попробовать другие бэкэнды кеша? Это может потенциально определить, есть ли у вас проблемы с представлениями или с Redis.
mpdonadio

Ответы:

1

Похоже, вы нашли правильный ответ от IRC. «Постоянно прерывистый» в моем опыте - это когда два источника заполняют кеш. Чаще всего это происходит, когда у вас есть сайт разработки и промежуточный / производственный сайт с разными базами кода, но с одной и той же базой данных. Кэши, предоставленные drupal, которые я прочитал для соединения с базой данных, поэтому информация о маршрутизации / функциях, которая кэшируется, будет загрязнять. Попадание на страницу admin / modules обновит кэш модуля и места, попадание на страницу списка admin / views очистит вашу ошибку, потому что она обновляет понимание представлений сайта с точки зрения вашего сайта, а не с точки зрения того, что конфликтует с вами.

Если у вас есть возможность администратора сервера, измените пароль к базе данных вашего сайта и пароль в файле settings.php, и посмотрите, что ломается. Ваши списки должны перестать быть испорченными, и то, что подделывает их, должно сломаться ... если они не связаны напрямую с вашим сайтом и не используют ваш файл settings.php.

Кроме того, убедитесь, что в вашем docroot нет нескольких установок модуля views.

DeveloperWeeks
источник