Özel önbellek uygulaması için en iyi uygulamalar?


17

Her varlık türünün her örneği için, aşağıdaki gibi adlandırılmış bir dizi önbellek oluşturuyorum: [module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]

Bir varlık her güncellendiğinde, ilgili varlık türü ve kimliğiyle başlayan tüm önbellekleri bırakmak istiyorum.

Bu önbellekleri nasıl saklamalıyım / temizlemeliyim?

Şu anda sadece cache_set () , ama ben ilgili tüm önbellek isimlerini bilmiyorum, ben temizlemek istediğinizde bir sorun sunuyor. Önbellek girdilerini db_delete () ile bırakmak güvenli mi?


İlgili tüm önbelleklerin adlarını bilmiyorsanız, nasıl kullanabilirsiniz db_delete()?
kiamlaluno

Yanıtlar:


6

Bir önbellekten girdileri silmek için cache_clear_all () kullanmanız gerekir . Bunun nedeni, kullanılan önbellek uygulamasının etkin veritabanında bir veritabanı tablosu kullanamamasıdır. DrupalDatabaseCache sınıfında olan budur , ancak her sınıf için doğru olmamalıdır.

_Cache_get_object () 'ye ( cache_get () ve cache_set () tarafından çağrılan işlev ) bakarsanız , aşağıdaki kodu içerdiğini göreceksiniz.

  static $cache_objects; 
  if (!isset($cache_objects[$bin])) {
    $class = variable_get('cache_class_' . $bin);
    if (!isset($class)) {
      $class = variable_get('cache_default_class', 'DrupalDatabaseCache');
    }
    $cache_objects[$bin] = new $class($bin);
  }
  return $cache_objects[$bin];

Önbellek uygulaması sınıfı her önbellek kutusu deposu için farklı olabilir ve hatta varsayılanı değiştirilebilir.

Özel güncelleme durumu önbellek sistemi , normal önbellek işlevlerinin _update_cache_clear () , _update_cache_get () ve _update_cache_set () 'de neden kullanılmadığını tam olarak açıklar . (Vurgu benimdir.)

Özellikle mevcut güncellemelerle ilgili getirilen verileri kaydetmek için temel önbellek API'sını KULLANMAYIZ. Bu önbelleğin yalnızca kullanılabilir yeni güncelleme verilerini başarıyla getirdikten sonra doldurduğumuzda temizlenmesi çok önemlidir. Çekirdek önbellek API'sinin kullanılması, bir sitenin "minimum önbellek ömrü" (hem minimum hem de maksimum) tanımlanmış olması da dahil olmak üzere her zaman kullanılabilir güncelleme verilerini getirmeye çalışılmasına neden olabilecek her türlü potansiyel sorunla sonuçlanır. veya bir site memcache veya geçici önbellekleri kabul eden başka bir takılabilir önbellek sistemi kullanıyorsa.

Güncelleme Yöneticisi modülü hala {cache_update} tablosunu kullanır, ancak yerine kullanılarak cache_set(), cache_get()ve cache_clear_all()orada bu aynı temel görevleri yerine ancak önbellek zamanından önce temizlenmez sağlamak Özel yardımcı fonksiyonları vardır ve veriler her zaman depolandığını, veritabanı, memcache veya başka bir önbellek arka uç kullanılıyor olsa bile.

Güncelleme Yöneticisi'nin Drupal çalıştıran herhangi bir siteden güncelleme bilgilerini potansiyel olarak alabileceğini göz önünde bulundurarak, güncelleme bilgilerini çok sık almaya çalışmak Drupal.org sunucularıyla ilgili sorunlara neden olacağından, Güncelleme Yöneticisi'nin gerekli özel ihtiyaçları vardır.

Sizin durumunuzda, [module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]tek bir önbellek kutusu deposu için önbellek kimliği olarak kullanabilirsiniz . Bir varlığın tüm girdilerini silmeniz gerekiyorsa, aşağıdaki kodu kullanabilirsiniz.

cache_clear_all("{$module}__{$entity_type}__{$entity_id}__", $bin, TRUE);

$moduleÖnbelleği temizlerken atanacak değeri alamıyorsanız veya önbellek girişini, verilerin önbelleğe alındığı modülden bağımsız olarak silmek istiyorsanız [entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from], veya gibi farklı bir önbellek kimliği kullanabilirsiniz [entity_type]__[entity_id]__[module_name]__[string_depending_on_where_the_cache_came_from]. cache_clear_all()ne zaman bir önbellek kimlik argüman olarak geçirilen dize ile başlayan tüm önbellek girdilerini siler $wildcardolduğunu TRUEve önbellek kimliği değil '*'. Bu durumda, önbellek aşağıdaki kodla temizlenir.

cache_clear_all("{$entity_type}__{$entity_id}__", $bin, TRUE);

8

Girişleri elle bırakmak neden bir soruna neden olabilir iyi bir neden düşünemiyorum. Bu, elbette, MySQL'i kendi önbelleğiniz için arka uç olarak kullandığınızı varsayar; her ne kadar aynı önbellek arka uç türü için geçerli olsa da, temizleme yöntemi mutlaka bir veritabanı sorgusu olmaz.

Çekirdek güncelleme modülünü örnek olarak alırsanız, cache_*işlevleri atlar ve önbelleğini manuel olarak temizler:

function _update_cache_clear($cid = NULL, $wildcard = FALSE) {
  if (empty($cid)) {
    db_delete('cache_update')
      // Clear everything except fetch task information because these are used
      // to ensure that the fetch task queue items are not added multiple times.
      ->condition('cid', 'fetch_task::%', 'NOT LIKE')
      ->execute();
  }
  else {
    $query = db_delete('cache_update');
    if ($wildcard) {
      $query->condition('cid', $cid . '%', 'LIKE');
    }
    else {
      $query->condition('cid', $cid);
    }
    $query->execute();
  }
}

Ben her zaman "çekirdek için yeterince iyi, benim için yeterince iyi" düşünüyorum :)

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.