[Решено] Обновление MODX 3.2.2 компонент FetchIt ломает сайт PHP 8.3

После обновления сайта с 3.2.0 до 3.2.2 фронтенд упал, сайт перестал открываться. Админка работает. MODX 3.2.2 / PHP 8.3.15

Ошибку пишет такую:

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, что могло «сломать» старый код.
Это всё понятно, а сайт как починить? Кроме этого ещё советовалось попробовать другой рукой провести разные манипуляции для поиска виновника crash'ества.

В итоге, после некоторых исследований, виновник был найден: мистер 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 году (что делать и куда идти жаловаться не понятно).

Хочется, чтобы всё было по фэн-шуй и правильное обновление лежало в репозитарии. Вдруг автор дополнения хочет сделать мир лучше и сделает исправленную версию. Аминь.
Денис Валентинович
modx.pro
58

Комментарии: 3

Иван Бочкарев
Вчера в 16:30
Создайте issue, я все баги по закрывал — жду проверки и выпустим новую версию

(и несколько незакрытых ошибок)
github.com/GulomovCreative/FetchIt/pulls

+ дополнение не адаптировано под MODX 3

@Баха Волков fyi
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
3