• 01-02-2023, 12:19:54
    #1
    Herkese selamlar,

    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 temizlendi
    Cache 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
    • merner
    • Baradiel
    merner ve Baradiel bunu beğendi.
    2 kişi bunu beğendi.
  • 01-02-2023, 12:24:37
    #2
    Platin üye
    Eline sağlık, forum ruhuna yakışan güzel paylaşımlar yapıyorsun.