Все способы, описанные ниже применялись для решения на версие Битрикс Управление сайтом.15.5.9.
Не рекомендуется использовать на других версиях, так как есть вероятность, что в таблицах и коде могли произойти изменения после обновлений.
Проблема раздутия таблицы b_sale_fuser
В таблице хранятся брошенные корзины.
Хранятся по умолчанию 100 дней. Изменить срок хранения можно в модуле интернет магазина-вкладка Настройки-Сохранять корзину (дней)
За очистку ответственен агент. На агенте функция:
CSaleUser::DeleteOldAgent(100, 0);
Если ваш магазин довольно посещаем, то может случиться так, что агент не будет успевать очищать старые корзины и в итоге вы получите раздутую таблицу b_sale_fuser
.
Удалять вручную записи таблицы не следует!
Как быстро очистить таблицу b_sale_fuser
Найдем функцию CSaleUser::DeleteOldAgent()
в файле \bitrix\modules\sale\general\basket.php
Она в свою очередь является оберткой для функции CSaleUser::DeleteOld()
в файле \bitrix\modules\sale\mysql\basket.php
Функция DeleteOld
в исходниках:
function DeleteOld($nDays) { global $DB; $nDays = IntVal($nDays); $strSql = "SELECT f.ID ". "FROM b_sale_fuser f ". "LEFT JOIN b_sale_order o ON (o.USER_ID = f.USER_ID) ". "WHERE ". " TO_DAYS(f.DATE_UPDATE)<(TO_DAYS(NOW())-".$nDays.") ". " AND o.ID is null ". " AND f.USER_ID is null ". "LIMIT 300"; $db_res = $DB->Query($strSql, false, "File: ".__FILE__." Line: ".__LINE__); while ($ar_res = $db_res->Fetch()) { CSaleBasket::DeleteAll($ar_res["ID"], false); CSaleUser::Delete($ar_res["ID"]); } return true; }
Разобрав код, вы увидите, что данные этой таблицы используются в других таблицах системы. И для корректного удаления записей из таблицы b_sale_fuser
нужно использовать 2 api функции битрикс:
CSaleBasket::DeleteAll();
CSaleUser::Delete();
Чтобы очистить таблицу b_sale_fuser
быстрее, можно :
- скопировать код функции DeleteOld;
- изменить LIMIT 300 на LIMIT 1000 (либо еще больше, смотря как быстро вы хотите её очистить);
- задать в начале значение переменной $nDays — допустимый срок хранения корзины;
- скопированный код можно повесить на CRON.
Проблема раздутия таблицы b_sale_viewed_product
В данной таблице хранятся просмотренные товары пользователей.
В настройках модуля «Интернет магазин» есть возможность изменить «Время хранения просмотренных товаров (дней)» и «Максимальное количество просмотренных товаров пользователя».
За очистку этой таблицы ответсвенена функция на агенте CSaleViewedProduct::ClearViewed()
, но она может не справлятся при большом количестве посетителей ИМ.
Как быстро очистить таблицу b_sale_viewed_product
Записи этой таблицы можно удалять sql запросом напрямую в бд.
Объясню почему мы можем это сделать.
Найдем в исходниках функцию CSaleViewedProduct::ClearViewed()
, которая наследуется из родительского класса CAllSaleViewedProduct
и находится в файле \bitrix\modules\sale\general\product.php
Эта функция является оберткой для CSaleViewedProduct::_ClearViewed()
Рассмотрим её код:
public function _ClearViewed() { global $DB; $viewed_time = COption::GetOptionString("sale", "viewed_time", "90"); $viewed_time = IntVal($viewed_time); $strSql = "DELETE ". "FROM b_sale_viewed_product ". "WHERE TO_DAYS(DATE_VISIT) < (TO_DAYS(NOW()) - ".$viewed_time.") LIMIT 1000"; $db_res = $DB->Query($strSql, false, "File: ".__FILE__." Line: ".__LINE__); return true; }
Как видим, идет прямой запрос в базу данных на удаление записей, т.е. данных, зависящих от записей этой таблицы, нет.
Проблема раздутия таблицы b_event
В таблице логируются события системы.
В Главном модуле на вкладке «Журнал событий» можно изменить значение «Сколько дней хранить события» и какие события необходимо записывать в таблицу.
Очищает таблицу функция CEventLog::CleanUpAgent()
на агенте.
Как быстро очистить таблицу b_event
Записи этой таблицы можно удалять sql запросом напрямую в бд.
Объясню почему мы можем это сделать.
Найдем в исходниках функцию CEventLog::CleanUpAgent()
, она находится в файле \bitrix\modules\main\classes\general\event_log.php
Рассмотрим её код:
function CleanUpAgent() { global $DB; $cleanup_days = COption::GetOptionInt("main", "event_log_cleanup_days", 7); if($cleanup_days > 0) { $arDate = localtime(time()); $date = mktime(0, 0, 0, $arDate[4]+1, $arDate[3]-$cleanup_days, 1900+$arDate[5]); $DB->Query("DELETE FROM b_event_log WHERE TIMESTAMP_X <= ".$DB->CharToDateFunction(ConvertTimeStamp($date, "FULL"))); } return "CEventLog::CleanUpAgent();"; }
Как видим, идет прямой запрос в базу данных на удаление записей, т.е. данных, зависящих от записей этой таблицы, нет.
А как очистить b_sec_session безопасно и быстро?