Суть проблемы:
Когда количество товаров в корзине достигает 300-500 начинает очень медленно работать добавление товара в корзину из плиток товаров со страницы категорий. С каждым разом это время увеличивается и процесс может занимать более минуты!
При пустой корзине товар добавляется за 2-3 секунды (что тоже многовато, но все привыкли).
Как воспроизвести проблему:
Просто класть товары в корзину.
На днях объявился оптовик, который сделал большой заказ и написал, что сайт ужасно тормозит при большом количестве товаров в корзине. До этого в таком объёме у нас не покупали и о проблеме известно не было.
Я проверил - проблема воспроизводится. На пятистах товарах в корзине время добавления зафиксировано 1 минута 38 секунд. В ходе процесса увеличивается расход памяти и загрузка процессора на компьютере.
Почистил кэш. Стало ощутимо быстрее добавляться в корзину, в районе 10-15 секунд.
Набрал 560 товаров. Появился забавный эффект - перестала работать пагинация, сортировка и переключение вида сетки на страницах категории.
Открыл сайт в режиме инкогнито, в учётную запись (где 560 товаров) не заходит, из другого браузера тоже. Колёсико крутится, потом прекращает, но ничего не происходит. В другую учётку заходит без проблем.
5.7.38
включен только еДост, все модули доставки выключены, включен расчёт стоимости доставки на странице товара
На большой корзине выявил, что невозможно выйти из учётной записи. Сайт не может записать сессию в базу из-за ограничения max_allowed_packet=16Мб в MySQL на хостинге. Предложили хранить сессии в файлах.
Детально не изучал и нагрузкой не тестировал, но вроде хранит в памяти и бэкапит в файл. я настраивал только на тесте и в конфиге правил maxmemory и maxmemory-policy.
Было бы весьма любопытно услышать мнение гуру по redis ))
Я посмотрел, что пишется в поле blob таблицы с сессиями. Там для каждого отдельного товара в корзине указаны все данные пользователя, от хэша пароля до адреса и дня рождения, 5 путей до картинки товара. Наверное, весь массив $products, я поленился сверять.
При каждом добавлении товара это всё читается из базы, преобразуется, дополняется и пишется обратно. Вот и тормоза.