- Problem Blowup tabeli b_sale_fuser
- Jak szybko usunąć tabelę b_sale_fuser
- Problem z rozszerzeniem tabeli b_sale_viewed_product
- Jak szybko wyczyścić tabelę b_sale_viewed_product
- Problem wysadzenia tabeli b_event
- Jak szybko wyczyścić tabelę b_event
Wszystkie opisane poniżej metody wykorzystano do rozwiązania wersji strony Bitrix.15.5.9.
Nie zaleca się używania go w innych wersjach, ponieważ istnieje możliwość, że tabele i kod mogą mieć zmiany po aktualizacji.
Problem Blowup tabeli b_sale_fuser
Opuszczone kosze są przechowywane w tabeli.
Domyślnie przechowywane przez 100 dni. Możesz zmienić okres przechowywania w module karty Sklep internetowy - Ustawienia - Zapisz koszyk (dni)
Agent jest odpowiedzialny za czyszczenie. Na funkcji agenta:
CSaleUser :: DeleteOldAgent (100, 0);
Jeśli Twój sklep jest dość odwiedzany, może się zdarzyć, że agent nie będzie miał czasu na wyczyszczenie starych koszyków, w wyniku czego otrzymasz zawyżoną tabelę b_sale_fuser.
Ręczne usuwanie wpisów w tabeli nie powinno być!
Jak szybko usunąć tabelę b_sale_fuser
Znajdź funkcję CSaleUser :: DeleteOldAgent () w modułach bitrix sale general file.php
To z kolei jest opakowaniem dla funkcji CSaleUser :: DeleteOld () w modułach bitrix sale mysql plik basket.php
Funkcja DeleteOld w kodzie źródłowym:
funkcja 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)”. „GDZIE”. „TO_DAYS (f.DATE_UPDATE) <(TO_DAYS (NOW ()) -„. $ NDays. ”)”. „AND o.ID ma wartość null”. „AND f.USER_ID ma wartość NULL”. „LIMIT 300”; $ db_res = $ DB-> Zapytanie ($ 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; }
Po przeanalizowaniu kodu zobaczysz, że dane z tej tabeli są używane w innych tabelach systemu. Aby poprawnie usunąć rekordy z tabeli b_sale_fuser, musisz użyć 2 funkcji interfejsu API bitrix:
CSaleBasket :: DeleteAll ();
CSaleUser :: Delete ();
Aby szybciej wyczyścić tabelę b_sale_fuser, możesz:
- skopiuj kod funkcji DeleteOld;
- zmień LIMIT 300 na LIMIT 1000 (lub nawet więcej, w zależności od tego, jak szybko chcesz go wyczyścić);
- ustaw wartość zmiennej $ nDays na początku - prawidłowy okres przechowywania koszyka;
- skopiowany kod można zawiesić na CRON.
Problem z rozszerzeniem tabeli b_sale_viewed_product
Ta tabela przechowuje zeskanowane produkty użytkownika.
W ustawieniach modułu Sklepu internetowego można zmienić „Czas przechowywania przeglądanych towarów (dni)” i „Maksymalna ilość oglądanych towarów użytkownika”.
Funkcja w agencie CSaleViewedProduct :: ClearViewed () jest odpowiedzialna za wyczyszczenie tej tabeli, ale może nie poradzić sobie z dużą liczbą odwiedzających IM.
Jak szybko wyczyścić tabelę b_sale_viewed_product
Rekordy tej tabeli można usunąć kwerendą sql bezpośrednio w bazie danych.
Pozwól mi wyjaśnić, dlaczego możemy to zrobić.
Znajdźmy funkcję źródłową CSaleViewedProduct :: ClearViewed (), która jest dziedziczona z klasy nadrzędnej CAllSaleViewedProduct i znajduje się w pliku bitrix moduły.
Ta funkcja jest opakowaniem dla CSaleViewedProduct :: _ ClearViewed ()
Rozważ jego kod:
funkcja publiczna _ClearViewed () {global $ DB; $ oglądany_czas = COption :: GetOptionString („sprzedaż”, „przeglądane_czas”, „90”); $ seen_time = IntVal ($ seen_time); $ strSql = "DELETE". „Z B_sale_viewed_product”. „WHERE TO_DAYS (DATE_VISIT) <(TO_DAYS (NOW ()) -„. $ Viewed_time. ”) LIMIT 1000”; $ db_res = $ DB-> Zapytanie ($ strSql, false, "File:" .__ FILE__. "Line:" .__ LINE__); powrót prawda; }
Jak widać, do bazy danych istnieje bezpośrednie żądanie usunięcia rekordów, tj. Brak danych w zależności od zapisów w tej tabeli.
Problem wysadzenia tabeli b_event
Zdarzenia systemowe są rejestrowane w tabeli.
W module głównym na karcie „Dziennik zdarzeń” możesz zmienić wartość „Ile dni na przechowywanie zdarzeń” i które zdarzenia muszą być zapisane w tabeli.
Funkcja CEventLog :: CleanUpAgent () agenta usuwa tabelę.
Jak szybko wyczyścić tabelę b_event
Rekordy tej tabeli można usunąć kwerendą sql bezpośrednio w bazie danych.
Pozwól mi wyjaśnić, dlaczego możemy to zrobić.
Znajdźmy funkcję kodu źródłowego CEventLog :: CleanUpAgent (), znajduje się ona w pliku bitrix moduły main główne ogólne ogólne event_log.php
Rozważ jego kod:
funkcja 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-> Zapytanie ("DELETE FROM b_event_log WHERE TIMESTAMP_X <=". $ DB-> CharToDateFunction (ConvertTimeStamp ($ date, "FULL")))); } return "CEventLog :: CleanUpAgent ();"; }
Jak widać, do bazy danych istnieje bezpośrednie żądanie usunięcia rekordów, tj. Brak danych w zależności od zapisów w tej tabeli.