Önbellek ve performans
CPalius'un performans stratejisi katmanlıdır; her katman bağımsız açılıp kapatılabilir ve hiçbiri çekirdeğin çalışması için zorunlu değildir (Redis olmadan da, Varnish olmadan da site açılır).
tarayıcı ─▶ [CDN] ─▶ [Varnish] ─▶ web sunucusu ─▶ [kaynak HTML önbelleği] ─▶ PHP/Symfony ─▶ [Redis/uygulama önbelleği] ─▶ veritabanı
Anonim trafik oturumsuzdur
Önbelleğin ön koşulu: ziyaretçi kimliksiz ise oturum çerezi ayarlanmaz. Çerezli bir yanıt herkese ortak önbelleğe konamaz. Bu nedenle sayaçlar, oylar ve bildirim durumları oturuma bağlı olmamalıdır (bkz. Kontrol listesi).
Kaynak HTML önbelleği (origin cache)
Çekirdeğin kendi sayfa önbelleğidir; Varnish ya da CDN kurmadan da çalışır. Yalnızca anonim GET isteklerini önbelleğe alır; yönetim, kimlik doğrulama ve form uçlarını asla.
| Ayar | Varsayılan | |
|---|---|---|
performance.cpalius.ttl |
86400 | Anlık görüntü ömrü (sn) |
performance.cpalius.excludes |
/aacp /admin /login /logout /hesap /api /_fragment /_profiler /_wdt |
Önbelleğe alınmayacak yol önekleri |
performance.cpalius.minify |
açık | HTML/CSS/JS küçültme |
performance.cpalius.compress_assets |
açık | Statik varlık sıkıştırma |
performance.cpalius.compress_images |
açık | Yerel görselleri sıkıştırma |
performance.cpalius.shield |
kapalı | Kaynak kodu kalkanı (HTML'i sıkıştırıp okunaksızlaştırır) |
Anlık görüntüler yanıt gönderildikten sonra (kernel.terminate) yazılır; ziyaretçi yazma maliyetini beklemez. Süresi dolanlar cpalius.origin_cache.purge görevi ile (15 dk'da bir) temizlenir.
Etiketli geçersiz kılma (cache tags)
Tüm önbelleği her değişiklikte silmek hem yavaş hem gereksizdir. Çekirdek Drupal'dan bilinen önbellek etiketi fikrini kullanır, ama bir yeniden kurma adımı olmadan: etiketler önceden kaydedilmeyen saf dizelerdir.
Bir denetleyici, yanıtının neye bağlı olduğunu söyler:
$this->tags->addEntityTag('node', $node->getId()); // "node:42"
$this->tags->addListTag('node', 'post'); // "node_list:post"
$this->tags->addConfigTag('blog.settings'); // "config:blog.settings"
$this->tags->setMaxAge(3600); // isteğe bağlı üst sınır
İstek sonunda OriginCacheWriter bu etiketleri okuyup anlık görüntüyü etiketlerle indeksler. Bir Node, User ya da Term kaydedilince/silinince EntityCacheTagInvalidator otomatik olarak yalnızca o varlığı ve liste etiketini taşıyan anlık görüntüleri siler. Yani kendi varlığınız FieldableInterface uyguluyorsa denetleyicide elle purgeAreas() çağırmanız gerekmez.
Elle temizleme gerektiğinde:
$purger->purgeAll(); // hepsi (içe aktarma sonrası gibi)
$purger->purgeTags('node:42'); // etikete göre
$purger->purgeAreas('blog'); // alan adına göre
Önbellek geçersiz kılma bir hook dinleyicisidir; hata verirse izole edilir ve varlığın kaydını engellemez.
Varnish
Varnish önünüzdeyse CPalius ona doğru Cache-Control başlıklarını verir. Yönetim ve kimlik doğrulama yolları her zaman private'tır; operatörün performance.varnish.excludes listesi ek önektir.
| Ayar | Varsayılan |
|---|---|
performance.varnish.backend_url |
http://127.0.0.1/ |
performance.varnish.port |
6081 |
performance.varnish.ttl |
120 |
performance.varnish.timeout |
2 |
Redis, Memcached, Nginx PageSpeed: arka uç yönetimi
AACP → Bakım → Performans ekranı (PerformanceBackendRegistry) her arka ucu canlı bağlantı sınamasıyla yönetir. Önemli kural: arka uç yalnızca son kayıtlı sınama başarılıysa etkinleştirilebilir. Yanlış bir Redis ayarının siteyi çökertmesi böylece önlenir.
| Arka uç | Ayarlar |
|---|---|
| Redis | host, port (6379), password, timeout |
| Memcached | host, port (11211), timeout |
| Nginx PageSpeed | durum kontrol adresi |
| Varnish | yukarıda |
Pano, bu servislerin durumunu gösteren sistem parçacıkları taşır.
Redis yoksa
Redis istemcisi (phpredis) kurulu değilse ya da bağlantı açılamazsa servis null döner ve tüketiciler "Redis çevrimdışı" kabul eder. Sebep: sıradan bir bağımlılık kenarı, eklenti yokken her rotayı (kurtarma konsolu dahil) 500'e düşürürdü. OptionalRedis bu yüzden vardır. Oturumlar için Redis kullanılıyorsa bir yedekleme (failover) oturum işleyicisi devreye girer.
Uygulama önbelleği ve yeniden kurma
Ayarlar, alan tanımları, rol haritası gibi sık okunan veriler cache.app içinde tutulur ve yazarken clearCache() / invalidate() ile geçersiz kılınır.
CacheRebuildManager panelden iki ayrı işi yapar; ikisi bağımsızdır:
- Sembolik önbelleği temizle (
clearSymfonyCache) - OPcache sıfırla (
resetOpcache) - Varlıkları yeniden derle (
rebuildAssets,compileMappedAssets) - Kod güncellemesinden sonra hepsini sırayla (
afterCodeUpdate)
Önbellek temizleme başarısız olursa bir işaret dosyası (cache-purge-failed.json) bırakılır ve panel bunu gösterir; sessiz başarısızlık olmaz.
Sayaç yeniden kurma (Rebuilder)
Bir modül, COUNT(*) gibi pahalı sayımları yazma yolunda değil, ayrı bir iş olarak yapar. RebuilderInterface uygulayan sınıf adlandırılmış bir "yeniden say" işi tanımlar (kimlik, ad, toplam, parti büyüklüğü, öncelik, rebuild($offset, $limit)). Studio'daki AJAX çalıştırıcı işi partiler halinde çağırır: her parti hızlı döner, bir sonraki offset ile tekrar çağrılır. Modüller kaydeder, çekirdek onları import etmez.
N+1 koruması
Geliştirme (ve test) ortamında tek istekte aynı tabloya 10'dan fazla sorgu gitmesi MaxQueriesExceededException fırlatır (tablo başına sınır). Bu, fetch join ya da toplu yükleme yazmaya zorlar. Yardımcılar:
- Alan referansları için
cp_fields_preload(items)(Twig) - Yetki filtresi için
QueryScopeApplier(SQL'e çevrilir) - Alan indeksi için
node_field_index
N+1 koruması yalnızca dev (ve test) ortamında etkindir; canlıda kapalıdır. Bunun bir nedeni vardır: üretimde etkin olsa kaynak önbelleği yazımını sessizce bozardı. Sorunu geliştirirken yakalayın.
Pratik reçete
- Küçük site: hiçbir şey kurmayın. Kaynak HTML önbelleği +
cache.appyeter. - Orta site: Redis'i (oturum ve uygulama önbelleği) ekleyin.
- Büyük/trafikli site: Varnish veya CDN'i öne koyun, medyayı uzak depolamaya kopyalayın (Medya ve depolama).
- Her değişiklikten sonra AACP → Performans'ta sınama çalıştırın.