Önbellek Formu tablosu boyutu çok büyük


13

Önbellek tablosunun boyutu geçen ay 10+ GB'a yükseldi ve keserek geçici olarak düzelttim. Son kontrol ettiğimde 1GB civarındaydı. Yani birkaç ay içinde tekrar 10GB'ı vuracak. Bu nasıl ele alınmalı?

Bu sitedeki tüm cron işlerini devre dışı bıraktığımı unutmayın. Nedeni bu ise, hangi cron etkinleştirilmelidir?

Yanıtlar:


24

{cache_form}Tablo diğer önbellek tabloları biraz farklı bir şekilde biraz komik ve davranacağını.

Eğer bakarsanız , bunun temizlenmediğini drupal_flush_all_caches()göreceksiniz {cache_form}. Bu, devam eden formları çukurdan korumak içindir.

system_cron()Fonksiyon eski verileri dışarı budama icabına yapar {cache_form}diğer önbellek tablolarla birlikte.

Gerçekten tüm Drupal sitelerinde cron çalıştırmalısınız . Eğer {cache_form}masanız çok büyükse, o zaman bahse girerim {watchdog}ve {session}tablolar da öyle. Diğer birçok modül, temizlik hook_cron()işlevlerini kendi işlevlerinin bir parçası olarak yürütür .

Ayrıca sorun kuyruğuna da bakabilirsiniz. Bazı hatalar oldu {cache_form}ve bir tanesiyle karşılaşıyor olabilirsiniz.


Tamam şimdi şimdi düzgün bir şekilde ayarlamıştım, ama yine de bir günde 2 GB'a büyüdüğünü görebiliyordum, ama bir haftadan beri sabitti. Bu tablolarda neler saklanacak?
GoodSp33d

1
{cache_form} devam eden form gönderimlerine sahip. {watchdog} günlüklerine ve {session} oturum bilgilerine (kullanıcı başına durum) sahiptir.
mpdonadio

6

Thumb Rule: Web sitenizin temizliği için Cron düzenli olarak çalıştırılmalıdır.

MPD'ye yaptığınız yorumda, cron'u kurup düzenli olarak çalıştırmanıza rağmen cache_form tablonuzun hızla büyüdüğünden bahsettiniz.

Bunun bir çözümü cronunuzu daha sık çalıştırmaktır. Her altı saatte bir mi yoksa daha az mı dersiniz? Bunu yapmayı göze alamıyorsanız, daha fazla okuyun.

Alternatif Çözüm:

mymodule_cron() {
    cache_clear_all(NULL, 'cache_form');
}

Elysia Cron'u yükleyin ve şimdi modülünüzün cron işlevini ayrı olarak çalıştırabilirsiniz. Modülün altı saatte bir çalışması için Elysia cron frekansını koruyabilirsiniz. Böylece cache_formmasanız altı saatte bir budanır.

Bu budama işlemi sırasında 6 saatten daha eski olmayan kayıtlar silinmeyecektir. Bunun nedeni, tüm girişlerin silinmesi durumunda, girişlerin silinmesi sırasında gönderilen formların garip davranmasıdır.

Https://api.drupal.org/api/drupal/includes!form.inc/function/form_set_cache/7 adresindeki koda bakın.

function form_set_cache($form_build_id, $form, $form_state) {
  // 6 hours cache life time for forms should be plenty.
  $expire = 21600;

Yorum okudukça onlar bol olması gerektiğini ve sizin durumunuzda çok bol oluyor varsayalım. Bu nedenle, hile cache_form tablosunu daha sık temizlemek ve $ expire değerini daha düşük bir değere düşürmektir; cache_form girişlerini varsayılan 6 altı saatten daha sık temizlemek istiyorsanız, TTL değerini değiştirmeniz gerekir. cache_form girişleri.

Sen yükleyerek bunu yapabilir cacheboject ve sonra uygulanması hook_cacheobject_presavesen TTL değiştirebilir, içinde 2 ya da 3 saat olabilir için.

mymodule_cacheobject_presave()($object, $cid, $bin) {
  // Extend the expiry period for prototype forms used in ajax enabled forms.                                                                  
  $cache_ttl = 1 ; // Change it to any number of hours
  if ($bin == 'cache_form') {
    $object->expire = REQUEST_TIME + $cache_ttl * 3600;
  }
}

Bu yaklaşımın bir dezavantajı, formların 2 saat içinde gönderilmemesi durumunda (ayarladığınız RTL değeri) form verileri kaybolabilir ve formun süresi dolmuş bazı sorunlar alabilirsiniz.



1

Çalıştığım bir sitede performans sorunları yaşarken, önbelleğe almayı düzelttikten sonra bununla karşılaştım. Makaleyi buradan okuyabilirsiniz: https://thinktandem.io/blog/2017/11/22/debugging-with-new-relic-blazemeter-strace-more/

Blog yayınımdan, bir kuyruk ve cron kurulumu ekleyebilir, ardından Elysia Cron gibi bir şeyi kullanarak hepsinin birlikte çalışmasını sağlayabilirsiniz:

/**
 * Implements hook_cron_queue_info()
 */
function THE MODULE_cron_queue_info() {
  // Set up the worker queue.
  $queues['THE MODULE_queue'] = array(
    'worker callback' => 'THE MODULE_queue_process',
    'time' => 600,
  );
  return $queues;
}

/**
 * Implements hook_cron()
 */
function THE MODULE_cron() {
  // Load up our worker queue.
  $queue = DrupalQueue::get('THE MODULE_queue');

  // Set up the query for expired results.
  $sql = "SELECT cid FROM {cache_form} WHERE expire < :time";
  $query = db_query($sql, array(':time' => REQUEST_TIME));
  $results = $query->fetchAll(PDO::FETCH_ASSOC);

  // Split this into chunks for safety and speed.
  $chunks = array_chunk($results, 5000);
  foreach ($chunks as $chunk) {
    // Add the chunk to the queue worker.
    $queue->createItem($chunk);
  }
}

/**
 * Worker callback defined in hook_cron_queue_info().
 *
 * @param array $data
 *   The array of cids we want to delete.
 */
function THE MODULE_queue_process($data) {
  db_delete('cache_form')
    ->condition('cid', $data, 'IN')
    ->execute();
}

1

Güvenli cache_form Clear modülünü kullanın .

İlk önce masayı makul bir boyuta ayarlamanıza, sonra korumanıza izin verecektir.

Proje sayfasından alıntı özet:

Cache_form tablosundan sınırlı sayıda öğeyi güvenle kaldırın.

Modül kurulduktan sonra, ilk olarak cache_form: ayarını yapın drush safe-cache-form-clear, tablo boyutu tutarlı kalana kadar çalıştırın , bu da 6 saatten eski tüm kayıtları kaldırdığınızı gösterir.

Daha sonra cron üzerinde çalışmaya devam edecektir.

Bu, Acquia tarafından aboneleri için bu amaçla belgelenen modüldür . Acquia dokümantasyon sayfası iyi ek bilgiler sağlar.

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.