1. Главная
  2. Форумы
  3. Техподдержка Drupal
  4. Решение проблем

Любые хуки модуля отрабатывают только до очистки кеша.

Главные вкладки

Тот самый случай, когда глаза самопроизвольно лезут на лоб. Или когда начинаешь думать о полтергейсте.

Видимо, без предыстории не обойтись. Постараюсь покороче, хотя не уверен, что настоящая причина именно в предыстории.

Началось с того, что написал модуль с кучей классов в /src/Form, но оставил абсолютно пустым файл .module. Даже без открывающего тега <?php в начале. К слову, первый раз в моей практике, когда просто по рассеянности забыл добавить в .module как минимум открывающий тег PHP. Этот файл был просто не нужен, поскольку работа шла с формами.

Модуль включил, написал формы. Далее понадобилось добавить хуки в .module.

Тут и обнаружил, что файл абсолютно пустой, нулевой длины. Ну и что, пустой и пустой. Добавляю открывающий тег и (опять рассеянность!) пишу его в сокращённой форме <?, что, видимо, не обрабатывается моим конкретным интерпретатором. Поскольку после очистки кеша получаю никакой результат. Т.е. - ни один хук не отрабатывает.

Копаю код, чертыхаюсь и в итоге обнаруживаю злосчастный открывающий тег. Исправляю на полную форму открывающего тега <?php. Пробую заново. Результат тот же - никакой. Хуки не отрабатывают. Чищу кеш - безрезультатно.

Многократно проверяю синтаксис хуков, мониторю журнал (где никаких подозрительных записей нет), чищу несколько раз кеш. Всё бесполезно, система не видит хуки модуля.

Решаюсь на радикальные меры. Отключаю модуль (Расширения > Удалить). Теряю, разумеется, при этом данные некоторых конфигураций модуля, ну и чёрт с ними. Включаю повторно модуль.

О, да. Хуки закрутились-завертелись, теперь всё работает. Неужели в самом деле?

Однако, радость преждевременная, как вскоре выяснилось. Поскольку после первой же очистки кеша ситуация вернулась в исходное унылое состояние. Хуки перестали работать. Без каких-либо наводок в журнале.

Нет мыслей. Пишу в каждом хуке просто для проверки короткий вызов \Drupal::messenger()->addWarning() с названием хука.

Повторяю процедуру. Удаляю модуль и включаю заново. Посыпались сообщения от хуков, всё отрабатывает. В журнале чисто, как и раньше.

Чищу кеш. История вновь повторяется, хуки умерли.

Удаляю опять модуль и включаю модуль, работает. Чищу кеш, не работает. Удивительная, захватывающая картина! Я могу бы так целый день делать (зуб даю!), но дела торопят, нужно как бы кодировать. )

У кого какие есть соображения?

На всякий случай: хуки, которые умирали после очистки кеша (всего 3 в модуле):

<?php
hook_page_attachments
()
hook_preprocess_page()
hook_form_alter()
?>

Кеш по HTTP-заголовкам отключен (т.е. стоит "Не кешировать") в настройках производительности.
Internal Dynamic Page Cache - вкл.
Internal Page Cache - вкл.
Короче, всё штатно по встроенным Друпаловским кешам.

PHP 8.1.13
Кеширование PHP APCu - включено (32 МБ)

Drupal свежий, недавно обновил до 9.5.8. Сборка почти "с коробки", всего 10 сторонних популярных модулей, из кастома помимо означенного модуля есть лишь ещё один, его тоже писал я и у него в .module только hook_install (создаёт таблицу в БД). Этот хук отработал в своё время без проблем.

К слову, по поводу последнего обновления. Никаких проблем при обновлении вроде не возникло, но я не знаю уже на что грешить.

Комментарии

Аватар пользователя OldWarrior OldWarrior 25 апреля 2023 в 3:51

Внезапно, спустя почти сутки, проблема решилась сама собой - без каких-либо дополнительных манипуляций с моей стороны. По крайней мере - перестала проявлять себя.

Что это было - до сих пор не могу понять. Понаблюдаю за дальнейшим поведением системы.

Может ли это теоретически быть связано с какими-то особенностями внутреннего кеширования PHP или какими-то неправильными его настройками на сервере?

Аватар пользователя voviko voviko 25 апреля 2023 в 10:41

я замечал, что надо очень эксклюзивно называть модули. Попробуй эти же хуки вынести в модуль с другим названием.
также проверить на return exit и тп по твоему коду. Может в opcahe и тп ушло что-то не то

Аватар пользователя OldWarrior OldWarrior 25 апреля 2023 в 18:35

voviko wrote:
я замечал, что надо очень эксклюзивно называть модули. Попробуй эти же хуки вынести в модуль с другим названием.
также проверить на return exit и тп по твоему коду. Может в opcahe и тп ушло что-то не то

Модуль называется global_config, это просто слой базовой конфигурации проекта с кастомными функциями и формами.

На opcache тоже было подозрение.

gun_dose wrote:
А какие-нибудь докеры-шмокеры используются?

Вот прям докеров нет. Но админ проекта установил и развернул среду на отдельном джайле на сервере. Т.е. теоретически что-то может быть настроено не совсем типичным для хостингов образом.

Аватар пользователя gun_dose gun_dose 26 апреля 2023 в 11:26
1

Просто в докере бывает такое, что он внезапно перестаёт видеть изменения в файловой системе, приходится рестартовать контейнер. Это в целом не нормальное поведение, но раз в пару лет у меня такое случается.

Аватар пользователя OldWarrior OldWarrior 27 апреля 2023 в 6:18

Спасибо, буду иметь в виду. Возможно, причина где-то рядом, поскольку используется Jail, который в теории как бы виртуализирует файловую систему конкретного джайла.

Логотип drupal.ru

Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

Документация по совместной работе с репозиторием drupal.ru – https://docs.drupal.ru/code

Drupal – торговая марка Дриса Бёйтарта

12+

AltStyle によって変換されたページ (->オリジナル) /