- Праблема разадзьмутая табліцы 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 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 ();"; }
Як бачым, ідзе прамы запыт у базу дадзеных на выдаленне запісаў, г.зн. дадзеных, якія залежаць ад запісаў гэтай табліцы, няма.