Wordpress İle Özel Bir Önbellekleme Mekanizması Nasıl Yapılır?

Wordpress İle Özel Bir Önbellekleme Mekanizması Nasıl Yapılır?
Wordpress İle Özel Bir Önbellekleme Mekanizması Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu uygulamayı hayata geçirmek için temel düzeyde PHP bilgisine ve WordPress functions.php dosyasına veya özel bir eklenti dosyasına erişiminiz olması gerekir. Çalışma ortamınızda şu gereksinimlerin karşılandığından emin olun:

  • PHP 8.2 ve üzeri: Modern sözdizimi ve performans iyileştirmeleri için gereklidir.
  • Yazma İzni: WordPress'in wp-content/uploads dizini içerisinde yeni klasörler oluşturma ve dosya yazma yetkisi.
  • Geliştirme Ortamı: Canlı sunucuda denemeden önce yerel bir WordPress kurulumunda (LocalWP veya Docker vb.) test yapmalısınız.

Adım 1: Önbellek Dizini ve Temel Yapıyı Oluşturma

Önbellek dosyalarımızı düzenli tutmak için wp-content/uploads/custom-cache dizinini kullanacağız. İlk olarak, bu dizinin varlığını kontrol eden ve yoksa oluşturan bir yardımcı fonksiyon yazmalıyız.

function custom_get_cache_dir() {
    $upload_dir = wp_upload_dir();
    $cache_dir = $upload_dir['basedir'] . '/custom-cache';

    if (!file_exists($cache_dir)) {
        wp_mkdir_p($cache_dir);
    }
    return $cache_dir;
}

Bu kod, WordPress'in dosya sistemi API'sini kullanarak güvenli bir dizin yolu oluşturur. wp_mkdir_p fonksiyonu, dizin ağacını otomatik oluşturarak izin hatalarının önüne geçer.

Adım 2: Veriyi Önbelleğe Yazma Fonksiyonu

Verileri dosyaya yazarken, verinin ne zaman oluşturulduğunu takip etmek için "zaman damgası" (timestamp) kullanacağız. Böylece belirli bir süre sonra önbelleğin geçersiz sayılmasını (cache expiration) sağlayabiliriz.

function custom_set_cache($key, $data, $expiration = 3600) {
    $file = custom_get_cache_dir() . '/' . md5($key) . '.cache';
    $content = [
        'expires' => time() + $expiration,
        'data'    => $data
    ];
    file_put_contents($file, serialize($content));
}

Burada md5() fonksiyonu, anahtar ismini (key) güvenli bir dosya ismine dönüştürür. serialize() ise PHP dizisini bir metin formatına çevirerek dosyaya yazılabilir hale getirir.

Adım 3: Önbellekten Veri Okuma ve Geçerlilik Kontrolü

Önbellekten veri okurken, dosyanın var olup olmadığını ve süresinin dolup dolmadığını kontrol etmeliyiz. Eğer süre dolmuşsa dosyayı silip null döndürmeliyiz.

function custom_get_cache($key) {
    $file = custom_get_cache_dir() . '/' . md5($key) . '.cache';

    if (!file_exists($file)) return null;

    $content = unserialize(file_get_contents($file));

    if (time() > $content['expires']) {
        unlink($file); // Süresi dolmuşsa sil
        return null;
    }

    return $content['data'];
}

Bu fonksiyon, okuma işlemini gerçekleştirir. Eğer unserialize() işlemi başarısız olursa veya dosya bozuksa, sistemin hata vermemesi için ek kontroller ekleyebilirsiniz.

Adım 4: Dinamik İçeriklerde Önbellek Kullanımı

Şimdi bu mekanizmayı gerçek bir WordPress senaryosunda, örneğin karmaşık bir veritabanı sorgusunda kullanalım. Aşağıdaki örnekte, veritabanından çekilen en popüler 5 yazıyı önbellekliyoruz.

function get_popular_posts_cached() {
    $cache_key = 'popular_posts_data';
    $data = custom_get_cache($cache_key);

    if ($data === null) {
        // Önbellek yoksa veritabanına git
        $data = get_posts(['posts_per_page' => 5, 'orderby' => 'comment_count']);
        custom_set_cache($cache_key, $data, 7200); // 2 saat önbellekle
    }

    return $data;
}

Bu yapı, veritabanı sorgusunu sadece 2 saatte bir tetikler. Diğer tüm isteklerde veriler diskteki dosyadan hızlıca okunur.

Adım 5: Önbellek Temizleme (Invalidation) Stratejisi

İçerik güncellendiğinde veya yeni bir yazı yayınlandığında önbelleği temizlemek gerekir. Aksi takdirde kullanıcılarınız eski verileri görmeye devam eder.

add_action('save_post', 'clear_custom_cache');

function clear_custom_cache() {
    $cache_dir = custom_get_cache_dir();
    $files = glob($cache_dir . '/*.cache');
    foreach ($files as $file) {
        unlink($file);
    }
}

save_post kancası (hook), herhangi bir yazı kaydedildiğinde çalışır ve tüm önbellek dosyalarını temizler. Bu, veritabanı tutarlılığı için en güvenli yöntemdir.

Karşılaştırma: Önbellekleme Yöntemleri

Yöntem Avantaj Dezavantaj
Dosya Tabanlı Basit, kurulum gerektirmez Disk I/O yoğunluğu
Transients API WordPress yerel, güvenli Veritabanını şişirebilir
Redis/Memcached Çok hızlı, RAM tabanlı Sunucu yapılandırması gerektirir
Kritik Güvenlik Uyarısı: Önbellek dosyalarınızın bulunduğu dizini .htaccess veya web sunucusu yapılandırması ile doğrudan erişime kapatın. Dosya isimlerini tahmin edilemez tutmak ve serialize edilen verilerin dışarıdan manipüle edilmediğinden emin olmak için dosya izinlerini 644 veya 600 olarak ayarlayın.

Sıkça Sorulan Sorular

Önbellek dosyaları sunucuda çok yer kaplar mı?

Küçük metin verileri ve dizi yapıları için dosya boyutları oldukça düşüktür. Ancak çok fazla farklı anahtar (key) kullanıyorsanız, periyodik olarak süresi dolmuş dosyaları temizleyen bir Cron Job kurmanız gerekebilir.

Bu yöntem WordPress'in kendi Transients API'sinden farkı nedir?

Transients API verileri genellikle wp_options tablosunda saklar. Bu da veritabanı tablonuzun büyümesine neden olur. Bizim yöntemimiz verileri dosyada tuttuğu için veritabanı üzerindeki yükü tamamen kaldırır.

Önbellek dosyasını nasıl debug edebilirim?

custom_get_cache_dir() fonksiyonunun döndürdüğü klasörü FTP üzerinden kontrol edebilir, dosyaları açıp içeriğini inceleyebilir veya error_log() kullanarak sistemin hangi aşamada olduğunu izleyebilirsiniz.

Canlı sitede önbelleği nasıl sıfırlarım?

Yukarıda paylaştığımız clear_custom_cache() fonksiyonunu bir admin menü öğesine bağlayarak veya bir WP-CLI komutu yazarak manuel olarak tetikleyebilirsiniz.

Bu yöntem e-ticaret siteleri için uygun mu?

Sepet ve ödeme gibi dinamik veriler için önbellekleme kullanmamalısınız. Sadece ürün listeleri, kategoriler ve blog içerikleri gibi statik veriler için kullanılması önerilir.

Kod Güvenliği Sorumluluk Reddi: Paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka güvenlik testlerinden geçirin. Kullanıcı girdilerini doğrudan önbellek anahtarı olarak kullanırken mutlaka sanitize_key() fonksiyonunu kullanarak XSS ve SQL Injection risklerini engelleyin.

Önbellek Performansını Ölçümleme ve İzleme

Özel bir önbellekleme sistemi kurduktan sonra, bu sistemin gerçekten işe yarayıp yaramadığını anlamak için somut verilere ihtiyacınız vardır. Performans analizi yaparken sadece sayfa yüklenme süresine değil, aynı zamanda veritabanı sorgu sayısına (query count) odaklanmalısınız.

Aşağıdaki kod bloğu, sayfanın en altına bir "debug" bilgisi ekleyerek önbelleğin çalışıp çalışmadığını ve toplam veritabanı sorgu sayısını görmenizi sağlar:

add_action('wp_footer', function() {
    if (current_user_can('manage_options')) {
        $queries = get_num_queries();
        $timer = timer_stop(0);
        echo "
"; echo "Sorgu Sayısı: " . $queries . " | Süre: " . $timer . "sn"; echo "
"; } });

Bu verileri izlerken şu metrikleri takip etmenizi öneririm:

  • Cache Hit Ratio: Önbellekten dönen isteklerin toplam isteklere oranı.
  • TTFB (Time to First Byte): Sunucunun ilk baytı gönderme süresi.
  • Disk I/O: Dosya tabanlı önbellekleme kullanıyorsanız, sunucunun disk okuma/yazma hızlarındaki değişim.

İleri Seviye: Önbellek Gruplandırma (Grouping)

Büyük ölçekli projelerde tüm önbellek dosyalarını tek bir klasörde tutmak, dosya sistemi performansını (inode limitleri) olumsuz etkileyebilir. Bunun yerine, önbellek anahtarlarını kategorize ederek alt klasörler oluşturmak daha verimli bir yöntemdir.

Örneğin, "ürünler", "kategoriler" ve "ayarlar" gibi gruplar için ayrı klasör yapıları oluşturabilirsiniz. İşte anahtarı klasör yapısına dönüştüren örnek bir yardımcı fonksiyon:

function get_cache_path_by_group($key, $group = 'default') {
    $upload_dir = wp_upload_dir();
    $cache_dir = $upload_dir['basedir'] . '/custom-cache/' . $group;
    
    if (!file_exists($cache_dir)) {
        wp_mkdir_p($cache_dir);
    }
    
    return $cache_dir . '/' . md5($key) . '.cache';
}

// Kullanımı:
$cache_file = get_cache_path_by_group('urun_detay_123', 'urunler');

Bu yaklaşım, özellikle wp_cache_delete_group() gibi bir fonksiyon yazarak belirli bir kategoriye ait tüm önbellek dosyalarını tek seferde temizlemenize olanak tanır. Bu sayede, tüm önbelleği boşaltmak yerine sadece güncellenen içeriğin önbelleğini geçersiz kılarak sitenizin genel performansını koruyabilirsiniz.

Önbellek Stratejisinde Sık Yapılan Hatalar

Sisteminizi optimize ederken şu hatalardan kaçınmanız, sitenizin kararlılığı için kritiktir:

  1. Hassas Verileri Önbelleğe Almak: Kullanıcıya özel (nonce, CSRF token, sepet içeriği) verileri asla genel önbellek dosyalarına yazmayın.
  2. Dosya Kilitleme (Locking) İhmali: Eş zamanlı yazma işlemlerinde dosya bozulmalarını önlemek için flock() fonksiyonunu kullanmayı unutmayın.
  3. TTL Süresini Çok Kısa Tutmak: Çok kısa TTL süreleri, önbelleğin sürekli yenilenmesine ve sunucu kaynaklarının gereksiz tüketilmesine neden olur.

Sonuç

WordPress ile özel bir önbellekleme mekanizması kurmak, sitenizin performansını optimize etmenin en etkili yollarından biridir. Bu rehberde öğrendiğiniz dosya tabanlı önbellekleme yöntemi, veritabanı sorgularını azaltarak sunucu yanıt sürelerini ciddi oranda düşürecektir. Bir sonraki adım olarak, bu sistemi Redis gibi bellek tabanlı teknolojilere taşıyarak hızınızı daha da ileri seviyeye taşıyabilirsiniz. Unutmayın, en iyi önbellekleme stratejisi, içeriğin güncelliği ile hız arasındaki dengeyi en iyi kuran stratejidir.

Bu yazıya tepkinizi paylaşın:
Emre Çelik

Verimlilik ve zaman yönetimi üzerine odaklanan bir yazarım. Günlük hayatı optimize eden ipuçları ve iş akışı optimizasyonu konularında içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz