Проблема раздутия таблиц b_sale_fuser, b_sale_viewed_product, b_event

Все способы, описанные ниже применялись для решения на версие Битрикс Управление сайтом.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();";
}

Как видим, идет прямой запрос в базу данных на удаление записей, т.е. данных, зависящих от записей этой таблицы, нет.

Рекомендуем к прочтению



1 Комментарий

Оставить комментарий

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.

Срок проверки reCAPTCHA истек. Перезагрузите страницу.