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

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

Аватар пользователя OldWarrior OldWarrior 24 апреля 2023 в 9:37

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

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

Началось с того, что написал модуль с кучей классов в /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, который в теории как бы виртуализирует файловую систему конкретного джайла.