- Проблема роздуття таблиці b_sale_fuser
- Як швидко очистити таблицю b_sale_fuser
- Проблема роздуття таблиці b_sale_viewed_product
- Як швидко очистити таблицю b_sale_viewed_product
- Проблема роздуття таблиці b_event
- Як швидко очистити таблицю 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 тисячу"; $ 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 ();"; }
Як бачимо, йде прямий запит до бази даних на видалення записів, тобто даних, що залежать від записів цієї таблиці, немає.