JekCMS, birbirinden bağımsız olarak ayarlanabilen üç ayrı önbellek katmanı uygular. Sayfa önbelleği tam HTML çıktısını saklar. Nesne önbelleği PHP nesnelerini istekler arasında depolar. Sorgu önbelleği sonuç kümelerini depolar. Hangi katmanın bir isteğe hizmet ettiğini ve ne zaman geçersiz kılınacağını anlamak yüksek trafikli sitelerde kritiktir.
Sayfa önbelleği en etkili katman. PAGE_CACHE_ENABLED true olduğunda, ilk istekten sonra tam HTML yanıtı cache/page_[hash].cache dosyasına depolanıyor. Önbellek anahtarı tam URL'den, aktif dilden ve cihaz türünden (mobil ya da masaüstü) türetiliyor. Aynı URL için sonraki istekler doğrudan dosyadan okunuyor ve PHP'yi tamamen atlıyor. Giriş yapmış kullanıcılar her zaman sayfa önbelleğini atlıyor.
Nesne Önbelleği: Varsayılan Olarak İstek Kapsamlı
Nesne önbelleği bireysel veri yapılarını — gönderiler, kategoriler, menüler, ayarlar — tek bir istek boyunca bellekte saklıyor. Amacı, aynı verinin bir sayfa oluşturma işleminde birden fazla kez gerektiğinde gereksiz veritabanı sorgularını önlemek. Nesne önbelleği varsayılan olarak istek kapsamlı; CACHE_DRIVER sabiti aracılığıyla harici bir depo (Redis veya Memcached) yapılandırmadığınız sürece istekler arasında kalıcı olmuyor.
Sorgu Önbelleği ve Eski Veri Sorunu
Sorgu önbelleği, veritabanı sorgularının sonuçlarını SQL dizesinin ve bağlı parametrelerin SHA-256 karmasıyla anahtarlanmış olarak saklıyor.
Nesne önbelleğinin aksine, sorgu önbelleği istekler arasında cache/query_[hash].cache dosyalarında varsayılan 300 saniyelik TTL ile kalıcı oluyor. Bu katman en sık "eski veri" sorununa yol açan katman: JekCMS gönderi kaydetme mekanizmasından geçmeden doğrudan SQL ile bir gönderiyi güncellerseniz, sorgu önbelleği TTL dolana kadar eski veriyi sunmaya devam eder.
Manuel Önbellek Geçersizleştirme
Sayfa ve sorgu önbellekleri için geçersizleştirme, gönderi kaydetme, güncelleme ve silmede tetiklenen action hook'ları aracılığıyla otomatik gerçekleşiyor. Toplu bir veritabanı işleminin ardından gibi zorla geçersizleştirme gerektiğinde, bir PHP betiğinden Cache::flush('query') veya Cache::flush('page') çağırın. Yönetim panelinin "Tüm Önbellekleri Temizle" düğmesi görsel proxy önbelleği dahil üç katmanı da kapsıyor.
Önbellek Yapılandırması ve Ayarlama
Her önbellek katmanının config/config.php dosyasında yapılandırılabilir parametreleri vardır:
// Sayfa önbelleği - tam HTML yanıtları
define('PAGE_CACHE_ENABLED', true);
define('PAGE_CACHE_TTL', 300); // 5 dakika
define('PAGE_CACHE_EXCLUDE', [
'/admin/*',
'/api/*',
'/search*'
]);
// Sorgu önbelleği - veritabanı sonuçları
define('QUERY_CACHE_ENABLED', true);
define('QUERY_CACHE_TTL', 300); // 5 dakika
// Nesne önbelleği sürücüsü
define('CACHE_DRIVER', 'file'); // file, redis, memcached
Varsayılan 300 saniyelik TTL çoğu site için iyi çalışır. Sık yayın yapan haber siteleri bunu 60 saniyeye düşürmelidir. İçeriği nadiren güncellenen siteler sunucu yükünü önemli ölçüde azaltmak için güvenle 3600 saniyeye (bir saat) çıkarabilir.
Nesne Önbelleği İçin Redis Kullanımı
50'den fazla eşzamanlı kullanıcıyı yöneten siteler için dosya tabanlı nesne önbelleği darboğaz olur. Redis'e geçmek önbelleğe alınmış okumalar için dosya sistemi G/Ç'sini ortadan kaldırır:
// config/config.php
define('CACHE_DRIVER', 'redis');
define('REDIS_HOST', '127.0.0.1');
define('REDIS_PORT', 6379);
define('REDIS_PREFIX', 'jek_');
Redis destekli nesne önbelleği istekler arasında otomatik olarak kalıcıdır. Standart bir VPS'te (2 vCPU, 4GB RAM) yapılan kıyaslamalarda Redis, 400 gönderi ve 50 kategoriye sahip bir sitede ortalama sayfa oluşturma süresini 145ms'den 38ms'ye düşürdü.
Önbellek Isınma Stratejisi
Tüm önbellekleri temizledikten sonra — dağıtım sırasında veya büyük içerik değişikliklerinden sonra — her URL'ye ilk gelen ziyaretçi soğuk önbelleğin performans maliyetini öder. Önbellek ısınma, en çok ziyaret edilen sayfalarınız için önbelleğe alınmış yanıtları önceden oluşturur:
# Site haritasından ilk 50 URL için önbellek ısıt
php tools/cache-warm.php --sitemap --limit=50
# Veya belirli sayfaları ısıt
php tools/cache-warm.php --urls="/,/hakkimizda,/iletisim"
Önbellek ısınmayı dağıtımdan hemen sonra çalıştırın. Betik her URL'ye dahili HTTP istekleri yaparak sayfa ve sorgu önbelleği oluşumunu tetikler. Tipik bir sunucuda 50 sayfayı ısıtmak yaklaşık 15 saniye sürer.
Önbellek Sorunlarını Giderme
Yaygın Belirtiler ve Çözümler
- Admin değişiklikleri ön yüzde görünmüyor: Sayfa önbelleği eski içerik sunuyor. Yönetim panelinden "Sayfa Önbelleğini Temizle" butonuna tıklayın veya TTL'nin dolmasını bekleyin.
- Doğrudan SQL değişiklikleri yansımıyor: Sorgu önbelleği sonuçları SQL hash'iyle anahtarlar. Doğrudan veritabanı değişikliklerinden sonra sorgu önbelleğini temizleyin.
- Aynı veri bir sayfada birden fazla kez yükleniyor: Nesne önbelleği etkin değil veya aynı sorgu farklı parametre biçimlendirmesi kullanıyor.
- Önbellek dosyaları çok fazla disk alanı kaplıyor: Önbellek temizleme cron görevini günlük çalışacak şekilde ayarlayın. 1.000 gönderili bir site varsayılan TTL'de yaklaşık 50MB önbellek dosyası oluşturur.
- Giriş yapmış kullanıcılar önbelleğe alınmış içerik görüyor: Bu olmamalı —
bootstrap.php'de sayfa önbelleği kontrolünden öncesession_start()çağrıldığını doğrulayın.
Önbellek İsabet Oranı İzleme
CACHE_STATS sabitini true olarak ayarlayarak yönetim paneli kontrol panelinde önbellek istatistiklerini etkinleştirin. Kontrol paneli widget'ı son 24 saat boyunca her önbellek katmanı için isabet oranlarını gösterir. Sağlıklı bir sayfa önbelleği isabet oranı %85'in üzerindedir. %70'in altına düşerse, çok fazla benzersiz URL'nin (sorgu parametreleri, sayfalama) önbelleği parçalayıp parçalamadığını araştırın.