Wyczyść pamięć podręczną nie czyści tabel pamięci podręcznej?

11

Nie w pełni rozumiem działanie czyszczenia pamięci podręcznej. Po prostu klikam w Wyczyść pamięć podręczną Wyczyść Wszystkie pamięci podręczne w: admin / config / development / performance, następnie idę do bazy danych, aby sprawdzić wszystkie tabele pamięci podręcznej _... i stwierdzam, że żadna z nich nie jest pusta.

Czy to normalne?
Czy mogę po prostu obciąć wszystkie tabele pamięci podręcznej _...?

W rzeczywistości muszę tylko wyczyścić cache_form. Czy mogę obciąć ten stół?

chefnelone
źródło

Odpowiedzi:

13

Czy mogę po prostu obciąć wszystkie tabele pamięci podręcznej _...?

Nie należy obcinać tabeli „cache_form”, ponieważ zawiera ona dane wykorzystane przez Drupala do ich sprawdzenia; jeśli usuniesz tę tabelę, formularz aktualnie przesyłany przez użytkownika zostanie unieważniony, a użytkownicy będą musieli ponownie przesłać formularz.

Mogą istnieć inne tabele pamięci podręcznej, które powodują dziwne działanie modułu. To jest powód, dla którego moduły używające dodatkowych tabel pamięci podręcznej (których nazwa zwykle zaczyna się od „cache_”) mają zaimplementować hook_flush_cache () w celu zwrócenia tabel pamięci podręcznej, które można wyczyścić z Drupala, a następnie wywoływane za pomocą następującego kodu, from drupal_flush_all_caches () .

  $core = array('cache', 'cache_path', 'cache_filter', 'cache_bootstrap', 'cache_page');
  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) {
    cache_clear_all('*', $table, TRUE);
  }

drupal_flush_all_caches()to funkcja wywoływana z system_clear_cache_submit () , procedury obsługi formularza przesyłania wywoływanej po kliknięciu przycisku „Wyczyść wszystkie pamięci podręczne” na stronie ustawień wydajności.

Podczas zadań cron system_cron () czyści pamięć podręczną przy użyciu następującego kodu.

  $core = array('cache', 'cache_path', 'cache_filter', 'cache_page', 'cache_form', 'cache_menu');
  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) {
    cache_clear_all(NULL, $table);
  }

Ponieważ pierwszym argumentem cache_clear_all () jest NULLnastępujący kod wykonywany w DrupalDatabaseCache :: clear () (Drupal 7).

if (variable_get('cache_lifetime', 0)) {
  // We store the time in the current user's $user->cache variable which
  // will be saved into the sessions bin by _drupal_session_write(). We then
  // simulate that the cache was flushed for this user by not returning
  // cached data that was cached before the timestamp.
  $user->cache = REQUEST_TIME;

  $cache_flush = variable_get('cache_flush_' . $this->bin, 0);
  if ($cache_flush == 0) {
    // This is the first request to clear the cache, start a timer.
    variable_set('cache_flush_' . $this->bin, REQUEST_TIME);
  }
  elseif (REQUEST_TIME > ($cache_flush + variable_get('cache_lifetime', 0))) {
    // Clear the cache for everyone, cache_lifetime seconds have
    // passed since the first request to clear the cache.
    db_delete($this->bin)
        ->condition('expire', CACHE_PERMANENT, '<>')
        ->condition('expire', REQUEST_TIME, '<')
        ->execute();
    variable_set('cache_flush_' . $this->bin, 0);
  }
}

Kod usuwa tylko wiersze, które nie są oznaczone jako trwałe i wygasły, z tabel zwróconych zi hook_flush_caches()z różnych tabel pamięci podręcznej używanych z Drupala, w tym „cache_form”. W "cache_form" nie powinno być zbyt wielu wierszy; jeśli tak się stanie, możesz skrócić czas między dwoma kolejnymi wykonaniami zadań cron lub wykonać następujący kod z niestandardowego modułu.

cache_clear_all(NULL, 'cache_form');

Alternatywą jest ręczne spowodowanie wyczyszczenia pamięci podręcznej za pomocą modułu Devel i pokazanego łącza menu.

zrzut ekranu

kiamlaluno
źródło
moim problemem jest to, że tabela cache_form ma rozmiar 63 MB dla witryny, która była produkowana przez JUST 2 dni. Obawiam się, że ten stół będzie rosnąć bez kontroli ...
chefnelone
1
Jeśli masz skonfigurowany cron, wygasłe wpisy ze wszystkich pamięci podręcznych (w tym cache_form) powinny być usuwane przy każdym uruchomieniu.
mpdonadio
1
@chefnelone Jak wyjaśnił kiamlaluno, jeśli masz poprawnie skonfigurowany cron, ta tabela powinna być okresowo czyszczona.
amator barista
2
@kiamlaluno, czytanie tej odpowiedzi jest bardzo pouczające i praktyczne, przydatne szybkie odniesienie do cierni związanych z pamięcią podręczną. 1+
amator barista
Jak powiedziałeś, uruchamiam crona i stół się wyczyścił. Dzięki.
chefnelone
6

Jeśli czyścisz pamięć podręczną za pomocą interfejsu użytkownika, to gdy tylko strona zostanie ponownie załadowana, pamięć podręczna zacznie się ponownie wypełniać. Innymi słowy, odświeżenie tej strony powoduje, że Drupal ponownie zaczyna buforować rzeczy (szczególnie cache_menu).

Możesz DELETE FROM cachebezpiecznie stawiać różne stoły.

Jestem też całkiem pewien, że zrobienie drush cc allspowoduje również w pełni puste tabele pamięci podręcznej.

mpdonadio
źródło
Dzięki, dla pewności muszę tylko wyczyścić cache_form. Czy mogę obciąć ten stół?
chefnelone
4
Jeśli przeczytasz kod api.drupal.org/api/drupal/include%21common.inc/function/… , zobaczysz, że cache_form nie zostanie wyczyszczony i dlaczego. Jeśli masz pewność, że jest to w porządku, powinieneś być w stanie to zrobić. Pojawiło się kilka historycznych błędów, w których cache_form nie wygasał wpisów i rośnie bez ograniczeń.
mpdonadio