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

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

    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 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 ();"; }

    Як бачым, ідзе прамы запыт у базу дадзеных на выдаленне запісаў, г.зн. дадзеных, якія залежаць ад запісаў гэтай табліцы, няма.


     

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

    Восточный

    Западный

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

    Северный

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

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

    Центральный

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

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

    Южный

    Поиск:      


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