Önbellek nedir ve türleri
Önbellek, bir işin sonucunu saklamaktır; böylece aynı iş bir dahaki sefere yeniden yapılmaz. Bu sitede, neredeyse aynı bayt sayısındaki aynı sayfanın ilk baytı önbellekten 23,5 ms, önbelleksiz 155,5 ms sonra geliyor.
- Ders 6 / 10
- Başlangıç
- Ücretsiz, kayıt yok
Bir istek bu katmanlardan geçer ve bulduğu ilk yanıt kazanır
Yukarıdan, ziyaretçiye en yakın olandan. Aşağı indikçe yanıt vermek pahalılaşır.
- Tarayıcı önbelleğiziyaretçinin kendi cihazında; hiç istek gönderilmez bir yıl
- CDN ucusunucunuzun dışında; sunucu temizliği oraya ulaşmaz otuz gün
- Sayfa önbelleğidiskte hazır HTML; varken PHP hiç çalışmaz tek dosya
- Nesne önbelleğikodun içindeki soruların yanıtları; oturum açmış kullanıcı için çalışan tek önbellek bellekte
- Kod ve veritabanıtemel; sayfa burada gerçekten kurulur ve bedelini ödersiniz önbelleksiz
Bu sıralama misafir bir ziyaretçi içindir. Oturum açmış bir kullanıcı üstteki üç katmanı atlar ve doğrudan alttaki ikisine iner.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
Önbellek gerçekte neyi saklar?
Önbellek, bir işin sonucunu saklar; böylece aynı iş bir dahaki sefere tekrarlanmaz. Bu tanım göründüğünden basittir ve çoğu eğitimin yanından geçtiği tek bir sonucu vardır: önbellek sayfanızı hafifletmez, yalnızca daha erken ulaştırır.
Bu iddianın sayısını bu sitenin kendisinden aldık. Ana sayfayı önbellekteki kopyasından on kez, önbelleği kıran bir parametreyle on kez, her seferinde sıkıştırma açıkken istedik ve ilk baytın ne zaman geldiğini kaydettik. Önbellekten ortanca 23,5 ms, en düşük ve en yüksek 22 ile 37 oldu. Önbelleksiz ortanca 155,5 ms, aralık 134 ile 182 arasındaydı.
Şimdi aynı iki yanıtın boyutu: önbellekteki kopya için 43,8 KB, o anda üretilen için 43,1 KB. Yavaş sürüm hızlı sürümle kabaca aynı boyutta, hatta bir tık daha küçük. O altı katlık farkın tamamı zamandır, bayt değil.
Yani biri önbelleğin siteyi hızlandırdığını söylediğinde, daha doğru cümle şudur: önbellek, sunucunun sayfayı kurmak için yaptığı işi ortadan kaldırır. O iş kodu çalıştırmak, veritabanına sormak, şablonu birleştirmek ve HTML üretmektir. Ortaya çıkan şey, bir dahaki sefere doğrudan gönderilen bir dosyadır.
Önbelleğin sınırı da aynı cümlede belirir ve bu ilerisi için önemlidir: sayfanız üç megabaytlık görsel taşıdığı için yavaşsa, önbellek bunun hiçbirine yaramaz. Önbellek kurulum süresini geri satın alır, indirme süresini asla.

Bir isteğin geçtiği dört katman
Biri sitenizin adresini açtığında, isteği birkaç önbellekten geçer ve yanıtı elinde tutan ilk önbellek yolculuğu bitirir. Sıralama ziyaretçiye en yakın olandan başlar.
Tarayıcı önbelleği ziyaretçinin kendi cihazındadır. Değişmeyen dosyalar orada kalır ve bir dahaki sefere hiç istek gönderilmez. Bu sitede yazı tipleri, betikler ve stil sayfaları Cache-Control: max-age=31536000 ile, yani bir yıllığına gider. Ana yazı tipi 25.272 bayt ve geçen hafta gelen bir ziyaretçi bugün onun için sıfır bayt öder. Bu en hızlı katmandır, çünkü işin içinde ağ yoktur.
İçerik dağıtım ağının ucu sunucunuzun dışındadır ve sayfanın bir kopyasını ziyaretçiye yakın tutar. Bu katmanın kendi dersi internet ve ağlar patikasında duruyor; burada gereken şey, ucun genellikle tarayıcıya gönderdiğinizden ayrı bir başlıkla yönlendirildiğidir.
Sayfa önbelleği kendi sunucunuzdadır ve bitmiş HTML dosyayı saklar. Bu sitede o dosyalar gerçekten dosyadır: hakkımızda sayfası 36.330 baytlık tek bir sıkıştırılmış dosya ve tüm sayfa önbelleği 1.980 dosya ve 112 MB. Dosya varken onu web sunucusu kendisi gönderir ve PHP hiç çalışmaz; 23,5 ms'yi üreten de budur.
Nesne önbelleği yığının dibindedir ve diğerlerinden farklıdır: sayfa değil, kodun içinde sorulan soruların yanıtlarını tutar. Bu sitede bunu Redis 7.4.7 yapıyor. Değeri, üstteki üç katman atlandığında görünür; örneğin hiçbir zaman önbellekli sayfa almayan, oturum açmış bir kullanıcı için. O kişi için hâlâ çalışan tek önbellek budur.
Bu dört katmanın altında hiç önbellek yoktur: kod çalışır ve veritabanı yanıtlar. Hiçbir katman yanıtı elinde tutmadığında fatura hep o 155,5 ms'dir.
Sayfa önbelleği ve nesne önbelleği farklı işler yapar
Sayfa önbelleği
- bitmiş HTML'in tamamını tek dosyada tutar
- yanıt verdiğinde PHP hiç çalışmaz
- misafir ziyaretçiler için; oturum açmış kullanıcıda genelde kapalıdır
Nesne önbelleği
- kodun içindeki soruların yanıtlarını bellekte tutar
- PHP yine çalışır ama veritabanına daha az sorar
- yönetim paneli ve oturum açmış kullanıcı için kalan tek katman
Hiçbiri diğerinin yerini tutmaz. Yalnızca ilkine sahip bir sitenin paneli yavaştır, yalnızca ikincisine sahip olanın genel sayfaları yavaştır.
Yaptığınız değişiklik neden hâlâ kimseye ulaşmadı?
Bu, önbelleğin en gündelik sorusudur ve yanıtı neredeyse hep aynıdır: temizlediğinizin önündeki bir katman hâlâ eski kopyayı tutuyordur.
Görülmesi gereken ilk şey, tek bir yanıtın biri tarayıcı biri uç için iki farklı önbellek talimatı taşıyabilmesidir. Bu sitenin sayfaları şu iki başlıkla gelir:
cache-control: no-cache, must-revalidate cdn-cache-control: max-age=2592000
Yani tarayıcıya her seferinde sor diyoruz, uca ise otuz gün sakla. Bu bilinçli ve yaygın, ama anlamının yerine oturması gerekir: kendi sunucunuzdaki önbelleği temizlemek o otuz güne dokunmaz. Sayfayı sunucuda yeniden kurarsınız, işiniz bitmiş gibi hissedersiniz, ziyaretçi ise ucun tuttuğu şeyi görmeye devam eder. Uca ulaşmak, uç hizmetinden temizlik istemek demektir ve bu ayrı bir eylemdir.
İkinci tuzak daha küçüktür ve daha çok vakit yer, çünkü başarısız bir temizliğe benzer. Her istekte diske gitmemek için web sunucusu dosya aramalarının sonucunu kısa bir süre saklar; bu sunucuda o pencere open_file_cache_valid ile altmış saniyedir. Önbellek dosyasını silersiniz, sayfayı hemen çekersiniz ve eski sayfa gelir. Bozulan bir şey yok. Dakikanın geçmesini bekleyin ve yeniden çekin.
Ve daha az düşünülen üçüncü durum: ziyaretçinin kendisi. Bir dosyayı bir yıllık ömürle gönderip sonra içeriğini değiştirdiyseniz, daha önce gelmiş birinin tarayıcısı bunu hiç öğrenmez. Doğru hamle dosyanın içeriğini değiştirmek değil, adını ya da adresindeki sürümü değiştirmektir; böylece yeni adres yeni dosya demek olur.
Ne asla önbelleğe alınmamalı?
Tek bir cümle bütün ciddi önbellek felaketlerini önler: sayfayı önbelleğe alın, kişiyi değil. Yanıtı iki kişi arasında farklılaşan hiçbir şey, sonra ikisine birden verilen bir dosyada saklanmamalıdır.
Örnekler hep aynılardır: alışveriş sepeti, hesap sayfası, kullanıcı adını basan her sayfa, doldurulmakta olan formlar ve ödeme sonucu sayfaları. En kötü başarısızlık biçimi tam da herkesin korktuğu şeydir: ilk kullanıcı sepetini görür, o önbelleğe alınır ve ikinci kullanıcı ilk kullanıcının sepetini görür.
Sayfa önbelleğinin oturum açmış kullanıcı için genellikle hiç çalışmamasının nedeni budur ve bu bir kusur değil, bir tasarım kararıdır. Ama sonucunu kabul etmek gerekir: yönetim paneliniz sitenin genel sayfalarından hep daha yavaştır, çünkü gerçekten her seferinde kurulur. Nesne önbelleğinin geriye kalan tek araç hâline geldiği yer tam burasıdır.
Bir de kararı size ait sınır durumu var: herkes için aynı olan ama çabuk bayatlayan sayfalar, örneğin stok durumunu gösteren bir sayfa. Bunlar önbelleğe alınabilir, yeter ki ömür kısa olsun ve en kötü durumun ne olduğunu bilin. En kötü durum birinin tükenmiş bir şeyi sipariş etmesiyse, ömrünüzün çok kısa olması ya da o parçanın önbelleğin dışında kalması gerekir.
Bunları önbelleğe alın
- herkes için aynı olan sayfalar: makaleler, hizmet sayfaları, ürün sayfaları
- değişmeyen dosyalar: yazı tipleri, görseller, sürümlenmiş stil sayfaları ve betikler
- bayatlayan ama herkes için aynı olan sayfalar, kısa ömürle
Bunları asla önbelleğe almayın
- sepet, ödeme ve ödeme sonucu sayfası
- kullanıcı adını ya da verisini basan her sayfa
- yönetim paneli ve yalnızca giriş sonrası görülen her yol
- form yanıtları ve tek bir istekle değişen her şey
Önbelleği temizlemek bedava değil
Her önbellek eklentisinin en basit düğmesi olan tümünü temizle, önbellekle yapabileceğiniz en pahalı iştir. Burada bir tutum alıyoruz, çünkü bedelini ödedik.
Önbelleğin tamamını temizlediğinizde, düşen her sayfanın yeniden kurulması gerekir. Eklentiniz temizlikten sonra sayfaları önden ısıtıyorsa, o yeniden kurma bir ziyaretçi geldiğinde değil hemen başlar. 1.980 önbellekli sayfası olan bir sitede bu, arka arkaya iki bine yakın tam PHP çalıştırması demektir. O 155,5 ms'lik ortancayla çarpımı kendiniz yapın ve bunun, aynı anda gerçek ziyaretçilere de yanıt veren bir sunucuda olduğunu unutmayın.
Fiilen uyguladığımız kural basit: yalnızca gerçekten değişen sayfaları temizleyin. Bir sayfanın metnini düzenlediyseniz, o tek bir adrestir. Site çok dilliyse her dil ayrı bir adrestir ve ayrı sayılır. Site geneli temizlik ancak gerçekten her sayfada bulunan bir şey değiştiğinde, örneğin başlık ya da genel bir stil sayfası, haklı çıkar; o zaman bile yeri sakin bir saattir.
Bir de sırası var; bariz görünür ve genellikle tersten yapılır: değişikliği önce önbelleksiz sürümde kontrol edip doğru olduğuna kanaat getirin, sonra temizleyin. Tersini yaparsanız her kaydetme yeni bir temizlik olur ve aynı sayfa beş kez yeniden kurulur.
Yapay zekayla hızlı yol
Bir değişiklik siteye ulaşmadığında alışılmış yol, sonunda düzelene kadar her şeyi tek tek temizlemektir. İşe yarar ve her seferinde pahalıdır. Hızlı yol, önce hangi katmanın yanıt verdiğini sormaktır ve bunu yanıt başlıkları söyler. Bir dil modeli bunu iyi yapar, çünkü iş yapılandırılmış bir metni okumak ve birkaç satırı birbirine bağlamaktır. Bunu sıradan bir sorudan ayıran şey: başlıkları iki adresten alın, adresin kendisinden ve aynı adresin anlamsız bir parametreli hâlinden, ve ikisini birden verin. Bu ikisinin farkı, teşhisin ta kendisidir.
- Her iki durumun başlıklarını alın: bir kez adresin kendisini, bir kez de hiçbir önbelleğin görmediği ?cb=12345 gibi rastgele bir parametreli hâlini.
- İkisini birlikte modele verin ve hangi katmanın yanıt verdiğini ve bunu hangi başlığın gösterdiğini sorun. İkinci durumu vermemek, yanıtı işe yaramaz kılan hatadır.
- Yalnızca kusurlu katmanı adlandırmasını ve gereken en küçük eylemi önermesini isteyin ve site geneli temizlik önermemesini açıkça söyleyin.
- Önerilen eylemi yapın, bir dakika bekleyin ve başlıkları yeniden alın. Bekleme isteğe bağlı değildir: web sunucusunun altmış saniyelik penceresi, doğru bir eylemi başarısız gibi gösteren şeyin ta kendisidir.
Kopyalamaya hazır şablon
Bunlar sitemdeki bir sayfanın iki durumdaki yanıt başlıkları.
Durum A, normal adres:
{başlıkların tamamını buraya yapıştırın}
Durum B, hiçbir önbelleğin görmediği rastgele parametreli aynı adres:
{başlıkların tamamını buraya yapıştırın}
Sunucuda yaptığım bir değişikliğin neden hâlâ görünmediğini bilmek istiyorum.
Kurallar:
1. Yalnızca bu başlıklardan akıl yürüt. İhtiyacın olan bir başlık metinde yoksa hangisinin gerektiğini söyle, tahmin etme.
2. A durumunda hangi katmanın yanıt verdiğini söyle: tarayıcı, uç, sayfa önbelleği ya da kod. Ve bunu hangi satırın gösterdiğini söyle.
3. A ile B durumunun içeriği farklıysa bunun ne anlama geldiğini söyle.
4. Kusurlu tek bir katman adlandır, birkaç tane değil.
5. Gereken en küçük eylemi öner. Site geneli temizlik ya da tüm önbelleği silmeyi önerme.
6. Bu başlıklarda bulunmayan hiçbir ayarın adını yazma.
Dört satırda yanıtla: yanıt veren katman, neden, önerilen eylem, sonrasında neyin değişmiş olması gerektiği.
Çıktıya güvenmeden önce: Model başlıkları iyi okur, ayarları kötü tahmin eder. Ona başlıksız olarak sitemin neden güncellenmediğini sorun; panelinizde var olmayan seçeneklerin adlarını tam bir güvenle yazar ve siz yarım saat onları ararsınız. Yukarıdaki altıncı kural bunun içindir. Ve bir iş asla modele bırakılmaz: her şeyi temizleme kararı. Bu, kaç sayfanız olduğuna ve günün hangi saati olduğuna bağlı operasyonel bir karardır ve model ikisini de bilmez.
Bu işte yapay zeka
Önbellek, yapay zekânın bir işte çok iyi, başka bir işte tehlikeli olduğu bir alandır. Başlıkları okumakta, bir yönergeyi açıklamakta ve bir hata mesajını insan diline çevirmekte iyidir. Ayar önermekte tehlikelidir, çünkü her önbellek eklentisi farklıdır ve modelin panelinizi görmesinin bir yolu yoktur. Tutumumuz: modeli teşhis için kullanın, yapılandırma için değil.
Gerçekten işe yarayan araçlar
- Claude Yukarıdaki teşhis işine uygundur: yapılandırılmış bir metni okur, birkaç satır arasındaki ilişkiyi bulur ve kural koyarsanız kurallara uyar. İran, Anthropic'in desteklenen ülkeler listesinde değil; dolayısıyla resmi kayıt da yok, İran kartı da kabul edilmiyor.
- Gemini Bir terimi ya da yönergeyi hızlıca anlamak istediğinizde iyidir; örneğin no-cache ile no-store farkı. Google'ın kendi sayfası, Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
- ChatGPT Aynı başlık okuma ve açıklama işi için yeterli. İran'dan erişim konusunda bir iddiada bulunmuyoruz, çünkü OpenAI'nin desteklenen ülkeler sayfası, o alan adının geri kalanı gibi, bu sunucuya 403 döndürüyor.
Nerede geri teper
Buradaki asıl risk uydurulmuş adlardır ve tanınmaya değer bir biçimi vardır. Model önbellek başlıklarının ve yönergelerinin örüntüsünü görmüştür; bu yüzden var olmayan bir başlık ya da hiç böyle bir seçeneği olmamış bir eklenti panelindeki bir seçeneğin adını yazabilir. Yanıtı doğru bir yanıta benzediği için fark etmek zordur. Basit sınav şudur: modelin yazdığı ve kendi gerçek başlıklarınızda ya da kendi ayarlar ekranınızda göremediğiniz her ad, aksi kanıtlanana dek yoktur. İkinci risk operasyoneldir: hemen her modele değişikliğimin neden görünmediğini sorun; yanıtının bir yerinde önbelleğin tamamını temizlemeyi önerecektir. Küçük bir sitede bu zararsız, binlerce sayfalı bir sitede pahalıdır ve model sizinkinin hangisi olduğunu bilmez.
Kaynaklar: MDN: Cache-Control Anthropic: supported countries Google: where Gemini Apps are available
Bu tavsiyenin sınırı
Bu ders sıradan bir sitenin sayfalarını önbelleğe almakla ilgilidir ve bilinmeye değer üç sınırı vardır. Birincisi, bir geliştiricinin ağır bir hesabın sonucunu bellekte tuttuğu, kodun kendi içindeki önbellekleme başka bir konudur ve buna burada girmedik. İkincisi, bu sayfadaki sayılar Avrupa'daki, diski ısınmış tek bir sunucudan geliyor; oranlar sitenize genellenebilir, sayılar genellenemez ve güvenilecek tek sayı kendi sitenizde kendinizin ölçtüğüdür. Üçüncüsü ve ikisinden de önemlisi: siteniz gerçekten her ziyaretçi için farklı bir sayfa kuruyorsa, bir gösterge paneli ya da sosyal ağ gibi, sayfa önbelleği sizin için doğru araç değildir ve yanıtınız yığında daha aşağıdadır.
Kendi işimizden
Önbellek için harcadığımız en pahalı saat, hata olmayan bir hatayı kovalamaya gitti. Bir sayfanın önbellek dosyasını sildik, sayfayı hemen çektik ve eski kopya geldi. Yeniden sildik, aynı sonuç. Dosyayı geri koyan şeyin ne olduğunu aramaya koyulduk. Yanıt şuydu: web sunucusu, her istekte diske gitmemek için dosya aramalarının sonucunu altmış saniye saklıyor ve biz her seferinde aynı altmış saniyelik pencerenin içinde yeniden test ediyorduk. Bozuk bir şey yoktu; beklememiştik. Bu artık bizde sabit bir kural: bir sayfayı temizledikten sonra bir dakika bekler, sonra kontrol ederiz; temizlikten hemen sonra bir şey yanlış görünüyorsa koda bakmadan önce saate bakarız.
Gerçek devam soruları
Kaç önbellek eklentisine ihtiyacım var?
Bir tane. Bir sitedeki iki sayfa önbelleği eklentisi birbiriyle kavga eder; sonuç bazen güncellenen bazen güncellenmeyen sayfalardır ve suçluyu bulmak neredeyse imkânsızdır. Nesne önbelleği ayrı bir eklentidir ve sayfa önbelleğiyle çakışmaz; onu yanında çalıştırabilirsiniz.
CDN'im varsa yine de sayfa önbelleğine ihtiyacım var mı?
Evet, çünkü farklı boşlukları doldururlar. Uç yalnızca birinin daha önce istediği ve ömrü dolmamış sayfaları tutar; yeni olan ya da uçtan düşmüş her adres için istek sunucunuza ulaşır ve orada sayfa önbelleği PHP'nin çalışıp çalışmayacağına karar verir. Yalnızca ucu olan bir site, uç her boşaldığında yavaşlığın tamamını tadar.
Önbellek ömrünü kaç yapmalıyım?
Varsayılan bir sayıyla değil, bir soruyla karar verin: bu sayfa bir saatlik olsaydı ne ters giderdi? Bir makale için yanıt hiçbir şeydir, o hâlde uzun bir ömür verin. Fiyat ya da stok gösteren bir sayfa için yanıt bir müşteri şikâyetidir; o hâlde ya ömrü çok kısaltın ya da o parçayı önbelleğin dışında tutun. Adında sürüm bulunan dosyalar istisnadır ve bir yıl kalabilirler, çünkü değişmeleri yeni bir ad demektir.