Официальный сайт движения «Москва без Лужкова!»
Главная Новости Москвы Наши новости Популярное
  • Новости
  • Популярное
  • Новости
  • ВХОД В ЛИЧНЫЙ КАБИНЕТ
    логин
    пароль
       
    Новости

    Проблема роздуття таблиць в бітрікс

    1. Проблема роздуття таблиці b_sale_fuser
    2. Як швидко очистити таблицю b_sale_fuser
    3. Проблема роздуття таблиці b_sale_viewed_product
    4. Як швидко очистити таблицю b_sale_viewed_product
    5. Проблема роздуття таблиці b_event
    6. Як швидко очистити таблицю 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 ();"; }

    Як бачимо, йде прямий запит до бази даних на видалення записів, тобто даних, що залежать від записів цієї таблиці, немає.


     

    Найди свой район!

    Восточный

    Западный

    Зеленоградский

    Северный

    Северо-Восточный

    Северо-Западный

    Центральный

    Юго-Восточный

    Юго-Западный

    Южный

    Поиск:      


     
    Rambler's Top100
    © 2007 Движение «Москва без Лужкова!»