[Решено] Обновление MODX 3.2.2 компонент FetchIt ломает сайт PHP 8.3
После обновления сайта с 3.2.0 до 3.2.2 фронтенд упал, сайт перестал открываться. Админка работает. MODX 3.2.2 / PHP 8.3.15
Ошибку пишет такую:
В логах партизанская тишина. Если бы мы знали, что это такое, но мы не знаем, что это такое [бабуля.jpg].
Даём Имитации Интеллекта эти информационные крошки и получаем подсказки для поиска разгадки:
попробовать другой рукой провести разные манипуляции для поиска виновника crash'ества.
В итоге, после некоторых исследований, виновник был найден: мистер FetchIt, призванный заменить устаревший AjaxForm – сломал сайт!
Вся боль от сломанного сайта прекращается после исключения данной строчки:
(файл core/components/fetchit/src/FetchIt.php:137)
Можно закомментировать или удалить эту строчку, но чудесным образом сайт начинает работать!
Пояснения от Искусственно Интеллектовича (ИИ):
Хочется, чтобы всё было по фэн-шуй и правильное обновление лежало в репозитарии. Вдруг автор дополнения хочет сделать мир лучше и сделает исправленную версию. Аминь.
Ошибку пишет такую:
Fatal error: Uncaught Exception: Serialization of 'PDO' is not allowed in
/core/src/Revolution/modResponse.php:184 Stack trace: #0
/core/src/Revolution/modResponse.php(184): session_write_close() #1
/core/src/Revolution/modRequest.php(154): MODX\Revolution\modResponse->outputContent() #2
/core/src/Revolution/modRequest.php(138): MODX\Revolution\modRequest->prepareResponse() #3
/core/src/Revolution/modX.php(1512): MODX\Revolution\modRequest->handleRequest() #4
/index.php(63): MODX\Revolution\modX->handleRequest() #5 {main} thrown in
/core/src/Revolution/modResponse.php on line 184В логах партизанская тишина. Если бы мы знали, что это такое, но мы не знаем, что это такое [бабуля.jpg].
Даём Имитации Интеллекта эти информационные крошки и получаем подсказки для поиска разгадки:
Эта ошибка означает, что PHP пытается сохранить данные текущей сессии пользователя (во время вызова session_write_close()), но внутри массива $_SESSION оказался объект подключения к базе данных (PDO).Это всё понятно, а сайт как починить? Кроме этого ещё советовалось
В PHP категорически запрещено сериализовать (сохранять в строку для кэша или сессии) активные соединения с БД.
Чаще всего это происходит, когда какой-то плагин, сниппет или дополнение по ошибке записывает весь объект $modx (или его часть, отвечающую за работу с БД) в сессию. При обновлении на MODX 3.2.2 изменились внутренние механизмы xPDO, что могло «сломать» старый код.
В итоге, после некоторых исследований, виновник был найден: мистер FetchIt, призванный заменить устаревший AjaxForm – сломал сайт!
Вся боль от сломанного сайта прекращается после исключения данной строчки:
(файл core/components/fetchit/src/FetchIt.php:137)
$scriptProperties['FetchIt'] = $this;Можно закомментировать или удалить эту строчку, но чудесным образом сайт начинает работать!
Пояснения от Искусственно Интеллектовича (ИИ):
Класс FetchIt зачем-то кладет самого себя ($this) в массив параметров $scriptProperties, который затем передается в сниппет FormIt. FormIt, в свою очередь, при сохранении состояния формы (например, если юзер ввел неверную капчу) берет весь массив параметров и складывает его в сессию. Поскольку внутри объекта FetchIt есть переменная $this->modx (которая получает ссылку на ядро MODX при создании класса), FormIt пытается сериализовать в сессию и её тоже. А внутри ядра MODX лежит активное подключение к базе данных (PDO). PHP это видит, бьет по рукам и выдает Fatal errorВ целом все понятно, всякое бывает, думаю, пойду-ка на GitHub и сообщу разработчику о данном конфузе. Казус в том, что там последняя версия 3.1.1 (и несколько незакрытых ошибок), а на ModStore последняя 3.1.2 (которая и установлена) и обновлялось это все в 2023 году (что делать и куда идти жаловаться не понятно).
Хочется, чтобы всё было по фэн-шуй и правильное обновление лежало в репозитарии. Вдруг автор дополнения хочет сделать мир лучше и сделает исправленную версию. Аминь.
Комментарии: 3
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
— github.com/GulomovCreative/FetchIt/pulls
+ дополнение не адаптировано под MODX 3
@Баха Волков fyi
Не адаптировано, но работало на версии до MODX 3.2.0.
github.com/GulomovCreative/FetchIt/pull/19
github.com/GulomovCreative/FetchIt/pull/18