Tema Performansı ve Önbellek
Tema her sayfada çalışır, yani iki kez hesapladığı şeyin bedeli iki kez ödenir. Önbellek yardımcısı bunu durdurur; doğruluğu anahtar belirler.
Genel Bakış
Temalar yapısı gereği ucuzdur: şablon değerleri gösterir, onları controller üretir. Temanın kurulumu yavaşlatabildiği tek yer hooks.php'dir.
Çaresi tek bir çağrıdır: kova, anahtar, ömür ve üretici. Doğruluğu iki şey belirler: anahtar ve dışarıda bıraktığınız şey.
Ön Koşullar
- Çalışan bir tema. hooks.php size yabancıysa önce Tema Kancaları ve Çıktı Filtrelerini okuyun.
- filter:template.variables için tema başına tek handler; yalnız son dönen değer saklanır.
- Açılacak bir şey yok; önbellek ayarı yardımcının içinde okunur.
Yapı
İşin Ait Olduğu Yer
| İhtiyaç | Ait olduğu yer | Ne sıklıkla çalışır |
|---|---|---|
| Tek sayfanın verisi (bu hizmetin faturaları) | Controller; sayfa verisiyle gönderilir | Bir kez ve yalnız o sayfada. |
| Her sayfanın ihtiyacı olan veri (footer kategorileri, para birimi şeridi) | Temanın hooks.php'si; değişken filtresi üzerinden | Her website isteğinde. Temanın istek başına maliyet yarattığı tek yer. |
| Sunum (döngüler, koşullar, biçimlendirme) | Şablon | Her sayfada ve bedava kalmak zorunda. Sorgu yapan şablonun hiç önbelleği yoktur. |
Anahtara Ne Girer
Anahtar sözleşmenin tamamıdır. Değerin bağlı olduğu her şey içinde görünmelidir.
| Parça | Nereden okunur | Eksik bırakmak neyi üretir |
|---|---|---|
| Para birimi | Money::getUCID() |
Önbelleği ilk ısıtan kişinin sembolüyle biçimlenmiş fiyatlar. |
| Dil | Language::selected() |
Her yerde tek dilde başlıklar ve bağlantılar. Bağlantılar seçili dil üzerinden kurulur. |
| Sorgunun kapsamı | Geçtiğiniz kategori, ürün ya da menü id'si | Tek kapsamın satırlarının her kapsama servis edilmesi. Sonradan parametre eklerken unutulan parça. |
| Ziyaretçi kimliği | Hiçbir yerden. Paylaşılan bir önbellekte asla yeri yoktur. | Ziyaretçi başına anahtar önbellek değil sızıntıdır. Ziyaretçiye özel değerler hiç önbelleklenmez. |
Adım Adım
1. Tekrarlanan İşi Bulun
- Handler'ın ne döndürdüğüne değil ne çağırdığına bakın; düz bir getter düğüm başına sorgu açabilir.
- Değerin nasıl değiştiğini sorun. Katalog verisi ve menüler bir saatlik bayatlığı kaldırır; stok ve sepet kaldırmaz.
- Değerin kime ait olduğunu sorun. Cevap bir kişiyi adlandırıyorsa hiçbir anahtar onu önbelleklenebilir yapmaz.
2. Üreticiyi Sarın
- Pahalı işi bir closure'a koyun. Önce hesaplayıp sonra önbelleklemek işi her seferinde çalıştırır.
- Anahtarı yukarıdaki parçalardan sabit bir sırada kurun ve başına temanıza özel bir ön ek koyun.
- Bir ömür seçin: operatörün düzenlediği veri için bir saat, referans verisi için bir gün. Sıfır hiç sona ermez.
- Aynı değer bir istekte defalarca isteniyorsa statik bir koruma ekleyin.
$ucid = (int) Money::getUCID();
$rows = Cache::remember('website', 'acme_footer_' . $ucid . '_' . Language::selected(), 3600,
fn (): array => Products::group_cards($ucid));
3. Kancaları Önbelleklenen Bölgenin Dışında Tutun
- Veriyi önbelleğe alın, filtreyi sonuca uygulayın. Üreticinin içinde modülün dinleyicisi önbellek kopyasına donar.
- Bağlamı önce yerel değişkenlere çıkarın; referanslı çalıştırıcıda literal ölümcül hatadır.
- Yayınlanan örneği izleyin: yazılım mağazası listesi satırlarını önbelleğe alır, sonra filtreler.
$out = Cache::remember('website', 'software_store_' . $categoryId . '_' . $ucid . '_' . Language::selected(), 3600,
function () use ($ucid, $categoryId): array {
// tek sorgu, çok satır, şablonun beklediği biçimde
return $this->build($categoryId, $ucid);
});
// Üreticinin DIŞINDA: bu, önbellekli ya da değil, her istekte koşmalıdır.
$ctx = ['currency' => $ucid, 'category' => $categoryId];
Hook::runRefs('filter:product.software_list', $out, $ctx);
return $out;
Referans
Kanonik Çağrı
// coremio/classes/Cache.php
// Üretici ne döndürüyorsa onu döner: dizi, dize, tam sayı, nesne.
public static function remember(string $name, string $key, int $ttl, callable $producer);
website, menüler menus kullanır.
Örnek API'si
Nadiren gerekir. Tek bir kaydı incelemek ya da kaldırmak için bunlara uzanın.
// coremio/classes/Cache.php
public static function getInstance(): self;
public function store($key, $data, $expiration = 86400): bool; // $expiration = 0 hiç sona ermez
public function retrieve($key, $timestamp = false); // yoksa ya da okunamıyorsa null
public function isCached($key): bool; // süresi dolmuşsa kaydı ayrıca düşürür
public function erase($key): self; // tek kaydı düşürür
public function eraseAll(): self; // bu örneğin işaret ettiği kovayı boşaltır
public function clear($keys = []): void; // adlandırılan kovalar, argümansız = tüm kovalar
get() ve set() yoktur. Eksik ya da bozuk kayıt null döner; kanonik çağrı bunu ıskalama sayar.
Geçersiz Kılma
| Tetikleyici | Çağrı | Neyi kaldırır |
|---|---|---|
| Operatör panelde bir şey kaydetti | Kaydeden operation tarafından zaten yapıldı | Her şeyi. Kaydetme operation'larının çoğu tüm depoyu temizler. |
| Panelin bilmediği bir şeyi önbelleklediniz | Cache::getInstance()->clear(['kova']) |
Yalnız adı verilen kovaları. Hem yazma hem okuma temanızdaysa kullanın. |
| Zamanın geçmesi | Hiçbiri | Kaydı; ömrü dolduktan sonraki ilk okumada. Süre sonu okuma anında denetlenir. |
Kova dosyası istek başına bir kez okunur; üç anahtar tek dosya okumasıdır.
Örnek
Footer'ında ürün grubu kartları olan bir tema. Üretici önbelleklenir, filtre dışarıda çalışır, şablon yalnız döner.
/*
* Tema başına TEK handler: view katmanı yalnız son dönen değeri saklar, yani ikinci bir
* kayıt burada set edilen her anahtarı düşürür. Anahtar ekleyin, ikinci Hook::add eklemeyin.
*/
Hook::add("filter:template.variables", 1, function ($template, $data) {
$data["footer_groups"] = acme_footer_groups();
return $data;
});
if (!function_exists('acme_footer_groups')) {
/**
* Footer şeridi için ürün grubu kartları. Her website sayfasında koşar, bu yüzden
* arkasındaki sorgu önbelleklenir; değeri her ziyaretçi paylaşır ve anahtarın onu
* ziyaretçiye özel kılan iki şeyi taşımak zorunda olmasının sebebi tam olarak budur.
*/
function acme_footer_groups(): array
{
// Aynı istek, birkaç partial: anahtar kurmayı bile atla.
static $rows = null;
if ($rows !== null) return $rows;
// Para birimi ziyaretçiden, bağlantılar seçili dilden gelir.
// İkisi de anahtara girer, yoksa ilk ziyaretçinin sürümü herkese servis edilir.
$ucid = (int) Money::getUCID();
$rows = Cache::remember('website', 'acme_footer_groups_' . $ucid . '_' . Language::selected(), 3600,
fn (): array => Products::group_cards($ucid));
return $rows;
}
}
Şablon sorgu da biçimlendirme de yapmaz: fiyat zaten biçimlenmiş geldi.
Tuzaklar
Önbelleği ısıtan değer, sayfayı ilk açan kişinin değeridir; yerelde bu hep sizsinizdir. Aynı gerekçe dil için de geçerlidir.
Closure'ın içindeki filtre yalnız kayıt yeniden kurulurken uygulanır. Modül temizlikten hemen sonra çalışır, bir dakika sonra durur.
Buna filtrelenen değerden sonraki bağlam da dahildir: literal ya da cast ölümcül hatadır.
Stok, sepet içeriği ve girişten sonra okunan hiçbir şey paylaşılan depodan geçmez. İkinci kişi için yanlış olan değer veri ifşasıdır.
Yalnız son dönen değer saklanır, yani ikinci kayıt birincinin her anahtarını düşürür. Belirti, şablon değişkenlerinin aynı anda boşalmasıdır.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.