Önbelleği temizle önbellek tablolarını temizlemiyor mu?


11

Önbelleği Temizle işlemini tam olarak anlamıyorum. Sadece önbelleği temizle'yi tıklatıyorum.

Bu normal mi?
Tüm önbellek _... tablolarını kısaltabilir miyim?

Aslında sadece cache_form'u temizlemem gerekiyor. Bu tabloyu kısaltabilir miyim?

Yanıtlar:


13

Tüm önbellek _... tablolarını kısaltabilir miyim?

Onları doğrulamak için Drupal'dan kullanılan verileri içerdiğinden, "cache_form" tablosunu kısaltmamalısınız; bu tabloyu silerseniz, şu anda kullanıcıdan gönderilen form geçersiz olur ve kullanıcıların formu tekrar göndermeleri gerekir.

Bir modülün garip davranmasına neden olan başka önbellek tabloları olabilir. Bu nedenle (önbellek genellikle "cache_" ile başlayan) ekstra önbellek tabloları kullanan modüllerin Drupal'dan silinebilen ve daha sonra aşağıdaki kodla çağrılan önbellek tablolarını döndürmek için hook_flush_cache () kullanması gerekir. dan 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()performans ayarları sayfasındaki "Tüm önbellekleri temizle" düğmesini tıklattığınızda çağrılan gönderim formu işleyicisi system_clear_cache_submit () ' den çağrılan işlevdir .

Cron görevleri sırasında system_cron () yöntemi aşağıdaki kodu kullanarak önbelleği temizler.

  $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);
  }

Cache_clear_all () işlevinin ilk bağımsız değişkeni olduğu gibi NULL, DrupalDatabaseCache :: clear () (Drupal 7) içinde yürütülen kod aşağıdaki gibidir.

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, yalnızca kalıcı olarak işaretlenmemiş ve süresi hook_flush_caches()bitmiş satırları, döndürülen tablolardan ve Drupal tarafından kullanılan ve "cache_form" dahil olmak üzere çeşitli önbellek tablolarından kaldırır. "Cache_form" da çok fazla satır olmamalıdır; bu olursa, cron görevlerinin iki ardışık yürütmesi arasında geçen süreyi azaltabilir veya özel bir modülden aşağıdaki kodu yürütebilirsiniz.

cache_clear_all(NULL, 'cache_form');

Alternatif, Devel modülünü ve gösterdiği menü bağlantısını kullanarak önbelleğin manuel olarak temizlenmesine neden olmaktır .

ekran görüntüsü


benim sorunum cache_form tablo SADECE 2 gün boyunca üretimde olan bir web sitesi için 63 MB boyutunda olmasıdır. Korkum, bu masanın
kontrolsüz büyüyeceği

1
Cron'u ayarladıysanız, tüm önbelleklerden (cache_form dahil) süresi dolmuş girdiler her çalıştığında temizlenmelidir.
mpdonadio

1
@chefnelone kiamlaluno'nun açıkladığı gibi, cron'unuzu düzgün ayarladıysanız, bu tablonun periyodik olarak temizlenmesi gerekir.
amatör barista

2
@kiamlaluno, bu cevabı okumak çok bilgilendirici ve pratik, önbellek ile ilgili dikenler için kullanışlı bir hızlı referans. 1+
amatör barista

Dediğin gibi cron koşuyorum ve masa temizlendi. Teşekkürler.
chefnelone

6

Kullanıcı arabirimi üzerinden önbellek temizliyorsanız, sayfa yeniden yüklenir yüklenmez önbellek tekrar dolmaya başlar. Başka bir deyişle, bu sayfayı yenileme işlemi Drupal'ın bir şeyleri yeniden önbelleğe almasına (özellikle cache_menu) neden olur .

Şunları yapabilirsiniz DELETE FROM cachegüvenle çeşitli tablolarda.

Ben de drush cc alltamamen boş önbellek tabloları ile sonuçlanacağından eminim .


Teşekkürler, sadece cache_form'u temizlemem gerektiğinden emin olmak için. Bu tabloyu kısaltabilir miyim?
chefnelone

4
Api.drupal.org/api/drupal/includes%21common.inc/function/… için kodu okursanız , önbellek_formunun temizlenmediğini ve nedenini göremezsiniz. Eğer varsa olumlu böyle iyi mi ki, o zaman bunu yapmak mümkün olmalıdır. Cache_form girdilerinin süresinin dolmaması ve w / o sınırının büyümesi gibi bazı tarihi hatalar oldu.
mpdonadio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.