Bugün PHP ile nasıl basit düzeyde bir Cache sistemi yapacağımızı anlatacağım. Bu Cache sistemimiz Memcached veya Redis gibi veritabanı için olan cache yapıları gibi değil. Sık ziyaret edilen fakat çok fazla değişmeyen sayfalarımızı kullanıcılara veritabanı vb. işlemler yapmadan çok daha hızlı şekilde göstermek için bir File System Cache yapısı kullanmayı göreceğiz.
File System Cache: Temel İşleyiş Mantığı
Öncelikle tabiki de çalışma mantığını öğrenmek, her yeni bilgiyi bu makale gibi kaynaklara geri dönüp her defasında okumak veya kopyala yapıştır yapmamanız için önemli.
File System Cache'in temel mantığı birden fazla nokta ile ( veritabanı bağlantısı + diğer PHP dosyaları gibi ) bağlantı kurarak yaratılan bir sayfanın son halini alıp tek bir statik cache dosyası haline getirmek ve sizin Route - URL/istek yönetim - sisteminiz sayfayı tekrar sizden talep ettiğinde önce cache dosyası ve süresini kontrol edip varsa/yaratılmışsa bunu servis etmenizdir.
"Output Buffering": Türkçe Adı ile "Çıktı Tamponlama"
Şimdi ingilizcesini yazmamın sebebi Output Buffering kelimesinin sonuna yazılım dilinin adını ekleyerek File System Cache için o dilde kullanılabilecek dökümantasyon sayfalarına hızlıca erişebiliyor olmanızdır.
PHP'de bir sayfanın çıktısını tamponlamak için "ob_" ile başlayan fonksiyon grubunu kullanıyoruz. ( Buradaki ob_ aslında Output Buffering kelimelerinin kısaltması
)ob_start() , ob_get_contents() ve ob_end_flush() Kullanımı
ob_start(): Bizim bir PHP dosyasındaki çıktı tamponlama işlemimizi başlatır. Bu fonksiyonu aynı buradaki gibi doğrudan yazdığınız andan itibaren kendisinden sonra yazılan ve bir ÇIKTI üreten bütün değerleri toplamaya ve kaydetmeye başlar.
ob_get_contents(): ob_start() ile kendisinin yazıldığı ana kadar geçen süre zarfındaki ÇIKTI olarak üretilen tüm içeriği size verir.
ob_end_flush(): Hem tamponlama işlemini bitirir hemde tamponlama da kalan değerleri temizler.
ob_start(); // Tamponlama başladı echo "Ben bir çıktı örneğiyim"; $cache = ob_get_contents(); // Bu ana kadarki ÇIKTI üreten içerik bir değişkene aktarıldı ob_end_flush(); // Tamponlama işlemi bitti ve içerik temizlendiCache Dosyasını Yaratmak ve Kullanmak
Yukarıdaki koddan gelen elimizde bir $cache değişkenimiz ve içeriğimiz artık var. Öncelikle bunu projemiz içerisindeki uygun bir alana dosya olarak kayıt ediyoruz.
$cache_dosya_yolu = "cache_dizinimiz/" . md5($_SERVER['REQUEST_URI']); // burada ki $_SERVER['REQUEST_URI'] komutumuz bize URL'deki isteği iletiyor ve biz bunu dosya isimleri okunaksız olsun diye md5'liyoruz. file_put_contents($cache_dosya_yolu, $cache);Şimdi aynı dosyamızın başına artık çalıştırmadan önce şöyle bir kontrol ekliyoruz
$cache_dosya_yolu = "cache_dizinimiz/" . md5($_SERVER['REQUEST_URI']);
if (file_exists($cache_dosya_yolu) && (time() - filemtime($cache_dosya_yolu) < 60)) { // Buradaki filemtime dosyanın değişikliğe uğradığı tarihi bize döndürüyor ve biz bunun süresini cache'i tutmak istediğimiz kadar olarak kontrol ediyoruz
// Sizin dosyayı okuma ve ekrana bastırma işlemleriniz
// Örneğin: readfile($cache_dosya_yolu);
}
else{
// Demekki cache dosyası henüz oluşturulmamış VEYA süresi geçmiş ve siz yenisini yaratacaksınız
}Tam Sayfanızın Örnek Hali$cache_dosya_yolu = "cache_dizinimiz/" . md5($_SERVER['REQUEST_URI']);
if (file_exists($cache_dosya_yolu) && (time() - filemtime($cache_dosya_yolu) < 60)) {
// ...
exit();
}
ob_start();
echo "Ben bir çıktı örneğiyim";
$cache = ob_get_contents();
file_put_contents($cache_dosya_yolu, $cache);
ob_end_flush();Yapınızı Class kullanımı, küçük cache dosyalarınızı veritabanına koyma vb. bir sürü işlem ile geliştirebilirsiniz. Wordpress'te ki bir çok eklenti veya yazılım - genellikle - temelinde bu sistemi kullanır.Bol Şanslar ve iyi geliştirmeler