Тот самый случай, когда глаза самопроизвольно лезут на лоб. Или когда начинаешь думать о полтергейсте.
Видимо, без предыстории не обойтись. Постараюсь покороче, хотя не уверен, что настоящая причина именно в предыстории.
Началось с того, что написал модуль с кучей классов в /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 (создаёт таблицу в БД). Этот хук отработал в своё время без проблем.
К слову, по поводу последнего обновления. Никаких проблем при обновлении вроде не возникло, но я не знаю уже на что грешить.
Комментарии
Внезапно, спустя почти сутки, проблема решилась сама собой - без каких-либо дополнительных манипуляций с моей стороны. По крайней мере - перестала проявлять себя.
Что это было - до сих пор не могу понять. Понаблюдаю за дальнейшим поведением системы.
Может ли это теоретически быть связано с какими-то особенностями внутреннего кеширования PHP или какими-то неправильными его настройками на сервере?
я замечал, что надо очень эксклюзивно называть модули. Попробуй эти же хуки вынести в модуль с другим названием.
также проверить на return exit и тп по твоему коду. Может в opcahe и тп ушло что-то не то
А какие-нибудь докеры-шмокеры используются?
Модуль называется
global_config
, это просто слой базовой конфигурации проекта с кастомными функциями и формами.На opcache тоже было подозрение.
Вот прям докеров нет. Но админ проекта установил и развернул среду на отдельном джайле на сервере. Т.е. теоретически что-то может быть настроено не совсем типичным для хостингов образом.
Просто в докере бывает такое, что он внезапно перестаёт видеть изменения в файловой системе, приходится рестартовать контейнер. Это в целом не нормальное поведение, но раз в пару лет у меня такое случается.
Спасибо, буду иметь в виду. Возможно, причина где-то рядом, поскольку используется Jail, который в теории как бы виртуализирует файловую систему конкретного джайла.
Семь бед - один reset
Прошло полтора месяца. Проблема не повторялась.