Drupal, varsayılan olarak Internal Page Cache ve Internal Dynamic Page Cache isimlerinde iki adet cache modülü ile gelmektedir.
Drupal önbelleği, metadata olarak veritabanında ve _cache prefix’ine sahip tablolarda saklanmaktadır. Cache mekanizmasının dışına çıkılarak, önbelleğin manuel olarak temizlenmesi gerektiği durumlarda:
- Drupal arayüzünden “Flush All Caches”
- Komut satırı arayüzünden “drush cr”
yapılarak önbellek anlık olarak sıfırlanabilir.
Internal Page Cache
Internal Page Cache, sayfaları anonim ziyaretçiler için önbellekte saklar.
Başka bir deyişle, siteyi ziyaret eden kullanıcı, oturum açmamışsa dahi tüm sayfa bilgileri saklanır.
Gelecekteki anonim ziyaretçiler, sayfa sıfırdan oluşturulmadığı için aynı içeriğin son derece hızlı
yüklendiğini göreceklerdir.
* Düzenli olarak güncellenen bir site için kullanılması tavsiye edilmez. Genellikle statik verilere sahip, one-page sitelerde tercih edilmesi uygundur.
Internal Dynamic Page Cache
Oturum açmış ya da açmamış olsun, tüm kullanıcılar için her sayfanın küçük bölümlerini önbelleğe almak
için tasarlanmıştır. Sayfanın her nesnesi meta veriler içerir ve bu meta veri parçası, Internal Dynamic Page Cache modülüne sayfayı önbelleğe alması gerekip gerekmediğini söyler.
Cache API (Önbelleklenebilir Metadata)
Önbelleğe alınabilir meta verileri üç özellikten oluşur:
- Cache Tags
- Cache Context
- Cache Max-Age
Cache Tags
Entities ve configurations gibi Drupal tarafından yönetilen nesnelere olan bağımlılıktır. Başka bir deyişle, önbelleğin hangi nesneye bağımlı olduğunu tanımlar.
Drupal; node’lar, block’lar, yapılandırma (configuration) ayarları, menüler gibi; her türlü önbellek senaryosunu açıklamak için
birden çok cache tag içerir.
Cache Tags, sitedeki bir şey değiştirildiğinde cache girdilerini otomatik olarak geçersiz kılar. Süreye bağlı değildir.
Örneğin; Node:5 cache tag’i, id’si 5 olan içeriğin her değiştirilmesinde kendisine ait önbelleğin geçersiz kılınacağını bildirir.
Cache Context
Context’ler, Tag’lerden oldukça farklıdır. Cache context’leri, cache girdilerinin yanında, içeriğin koşullara göre değişecek şekilde önbelleğe alınmasını sağlar.
Örneğin, birkaç farklı rolde kullanıcılarınız var ve rol için içeriğin farklı şekilde önbelleğe alınması gerekiyor… Bu durumda, Cache Tags tek başına yeterli olmayacaktır. “User Permissions” bağlamına sahip cache context tanımlanmalıdır.
return [ '#data' => $data, '#cache' => [ 'tags' => $tags, 'context' => ['user'] ] ];
Cache Max-Age
Önbelleği ne kadar süre ile geçerli kılmak istediğinizi ayarlayabilirsiniz.
max-age: 3600 olarak ayarlarsanız, cache 1 saate kadar geçerli olur. Süre dolduğunda önbellek geçersiz olur.
Bir sonraki kişi sayfayı ziyaret ettiğinde önbellek güncellenerek, yeniden 1 saat süreyle geçerli hale gelir. Hiç önbelleğe almak istemiyorsak max-age: 0 olmalıdır.
Tüm özellikleri (Cache Tags, Cache Context, Cache Max-Age) içeren örnek bir kullanım:
'#cache' => [ 'contexts' => ['languages', 'timezone'], 'tags' => ['node:5', 'user:3'], 'max-age' => Cache::PERMANENT, ]
REST View Modülünde Önbellek Kullanımı
Drupal REST Views API cache’leri ilk kez oluşturulurken, gelen request parametresi hatalı ise hatalı dönen response önbelleğe alınır.
Caching yöntemi TAG-BASED ise ilgili içerik güncellenene kadar cache invalidate olmaz. (Hatalı ise hatalı olarak kalır.)
Caching yöntemi TIME-BASED ise geçerlilik süresince cache invalidate olmaz. (Hatalı ise süre bitene kadar hatalı olarak kalır.)
Hatalı önbellek durumlarında “Flush All Caches” yapılarak cache rebuild edilmelidir.
Caching yöntemleri, REST Export ekranındaki ADVANCED alanında belirlenmektedir.
Hata Oluşmasının Önüne Geçmek
Gelen isteklerin, request parametrelerinin hatalı olmamasına dikkat edilmelidir.
Hatalı istekler Reports > Recent log messages ekranında filtrelenebilir. Örnek: Illegal choice zh-Hant in locale element. (zh-hant olmalı)
TIME-BASED caching yöntemine geçilerek cache’lerin süreye bağlı olarak invalidate edilmesi tercih edilirse gözden kaçan hatalar kendiliğinden düzeltilebilir.
Drupal Cache ve Memcache Birlikte Kullanımı
Drupal Cache, veritabanında saklanırken; Memcache kullanarak, RAM aracılığı ile daha performanslı bir cache sistemi sunabiliriz. İkisi de farklı katmanlardadır ve birlikte kullanılabilir.
Birlikte kullanım senaryolarında, Drupal cache invalidate ve Memcache lifetime vade süreleri iyi kurgulanmalıdır.
Memcache Kurulumu
- Sunucuya Memcache kurulmalıdır.
- Memcach contrib modülü CMS’e eklenmeli ve aktif hale getirilmelidir.
- settings.php içerisinde memcache konfigürasyonu yapılmalıdır:
$settings['memcache']['servers'] = ['127.0.0.1:11211' => 'default']; $settings['memcache']['bins'] = ['default' => 'default']; $settings['memcache']['key_prefix'] = ''; $settings['cache']['default'] = 'cache.backend.memcache'; $settings['cache']['bins']['render'] = 'cache.backend.memcache';
Aynı sunucuda birden fazla CMS varsa her settings.php için key_prefix belirtilmelidir.