Если у вас проект активен, то обращали ли вы внимание на количество записей b_sale_fuser (идентификаторов корзин)?
в идеале он должен содержать только записи не старее, чем интервал хранения корзин в настройках системы.
Если же это не так, тогда:
1. Смотрим, работает ли агент CSaleUser::DeleteOldAgent();
2. Анализируем, успевает ли агент удалять старые корзины
если агент работает, но таблица b_sale_fuser растет - поздравляю!
Ваш проект достаточно активен, чтобы агент с текущими настройками не успевал удалять старые записи.
По умолчанию интервал работы агента 28800 секунд (8ч)
Но агент при срабатывании удаляет не более 300 старых записей
Вот пример кода функции отвечающей за удаление старых корзин:
Т.е. если за 8 ч. у вас в таблице b_sale_fuser появляется более 300 записей, она обречена на "разбухание".
Ну и вывод таков:
так как нескромно лезть в ядро и менять жестко заданные лимиты в запросах (да и скорость теряем при этом на работе агента), то уменьшаем интервал таким образом, чтобы держать размер таблицы "под контролем".
Пишу данный пост, так как уже встречал проекты с "распухшими корзинами".
Да вот и на одном из своих недавно обнаружил 600000 записей
в идеале он должен содержать только записи не старее, чем интервал хранения корзин в настройках системы.
Если же это не так, тогда:
1. Смотрим, работает ли агент CSaleUser::DeleteOldAgent();
2. Анализируем, успевает ли агент удалять старые корзины
если агент работает, но таблица b_sale_fuser растет - поздравляю!
Ваш проект достаточно активен, чтобы агент с текущими настройками не успевал удалять старые записи.
По умолчанию интервал работы агента 28800 секунд (8ч)
Но агент при срабатывании удаляет не более 300 старых записей
Вот пример кода функции отвечающей за удаление старых корзин:
function DeleteOld($nDays) { global $DB; $nDays = IntVal($nDays); $strSql = "SEL ECT ID ". "FR OM b_sale_fuser ". "WHERE TO_DAYS(DATE_UPDATE)<(TO_DAYS(NOW())-".$nDays.") LIMIT 300"; $db_res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); while ($ar_res = $db_res->Fetch()) { CSaleBasket::DeleteAll($ar_res["ID"], false); CSaleUser::Delete($ar_res["ID"]); } return true; } |
Т.е. если за 8 ч. у вас в таблице b_sale_fuser появляется более 300 записей, она обречена на "разбухание".
Ну и вывод таков:
так как нескромно лезть в ядро и менять жестко заданные лимиты в запросах (да и скорость теряем при этом на работе агента), то уменьшаем интервал таким образом, чтобы держать размер таблицы "под контролем".
Пишу данный пост, так как уже встречал проекты с "распухшими корзинами".
Да вот и на одном из своих недавно обнаружил 600000 записей
Коллеги, уже давненько штатные компоненты Битрикс не создаюь проблем, описанных в посте
Поэтому такую проблему можно встретить скорее всего на старых проектах
В интернете нашёл пример функции для агента примерно такого же как у вас в примере, только SQL Запрос чуть шире (не знаю зачем)
Но!
Оказалось что новые записи плодятся с хорошей скоростью ~ 20-30 записей в минуту. Проверил компонент basket.basket.small - там уже по умолчанию стоит вызов CSaleBasket::GetBasketUserID и проверка ID пользователя.
Теперь пытаюсь понять - откуда создаётся столько корзин. Сайт не высоконагруженный (800-900 посетителей в сутки + естественно боты)
Возможно, где-то некорректно вызывается тот самый GetBasketUserID
Обратились к разработчикам используемого решения для интернет-магазина. Там денёк подумали и ответили, что проблема в самом Битриксе. Теперь ждём что ответит Битрикс.
Обратились к разработчикам используемого решения для интернет-магазина. Там денёк подумали и ответили, что проблема в самом Битриксе. Теперь ждём что ответит Битрикс.
когда-то реально была такая проблема в Битркис, но вроде как ее уже устраняли
Но именно поэтому мы для своих решений сразу делали собственные компоненты малых корзин.
сбросьте в личку информацию про используемое вами решение и примерную дату его приобретения (но лучше только в личку)
Если вы - спасибо.
Ради интереса посмотрели на других проектах, есть подозрение, что вы помогли поймать баг, который по-видимому прилетел с каким то обновлением Битрикс. Коллег из Битрикс мы постарались оперативно уведомить, думаю, что все будет ок.
Нужна помощь, настроить корректно очистку таблицы с корзинами.