PHP ile veri cache (önbellekleme) işlemi

Cache (önbellek) gerçekleştirilen bir işlem sonucunun daha hızlı, daha zahmetsiz erişilebilecek bir yere kaydedilmesidir. Kaydedilen veriler belirli bir süre kullanılabilir olup, süre dolduğunda güncellenirler. Örnek ile açıklayacak olursak…

Düzenleme yaptığım bir e-ticaret sitesinde fiyatlar Euro cinsinden girilmiş. Fiyatların bulunduğu sayfalar her açıldığında PHP dosyası TCMB’nın sitesine bağlanıp döviz kurlarını alarak Euro cinsinden olan fiyatı Türk Lirası’na çeviriyordu.

Tahmin edebileceğiniz gibi sayfa her yenilendiğinde bir web sayfasını çağırmak da sunucu performansını oldukça düşüren bir işlemdi. Sadece bu da değil, eğer ziyaretçi sayımız fazla olursa TCMB’nın sunucuları saldırı yaptığımızı sanarak ip’mizi de engelleyebilirdi. İşte burada imdadıma cache sistemi yetişti…

Bu işlem için yazımın altında bulunan basit cache sınıfını hazırladım. Bu cache sistemi eğer 24 saatlik süre doldu ise TCMB üzerinden kurları çekip “kurlar.txt” adı ile yerel sunucuya kaydediyor, eğer süre dolmadı ise “kurlar.txt” dosyasında bulunan içeriği çıktı olarak veriyor. Üzerinde basit değişiklikler yaparak kur dışındaki işlemler için de kullanabilirsiniz.

Önemli Not: “kurlar.txt” dosyasını oluşturup chmod değerini 777 verdikten sonra ilk test için $cache_suresi değişkenini 0 olarak ayarlayın. Eğer 0 olarak ayarlamazsanız dosyanın oluşturulma tarihinden $cache_suresi sonrasına kadar “kurlar.txt” nin içi boş kalacaktır.

<?php

# önbellek süresi (saniye cinsinden)
# ilk çalıştırmada 0 yapın!
$cache_suresi           = 43200;

class onbellek{
# eğer önbellek süresi doldu ise yapılacak işlemler. (Örn: Veritabanından şu veriyi çek)
function veri(){
    $sayfa      = file_get_contents('http://www.tcmb.gov.tr/kurlar/today.xml');
    preg_match('~<CurrencyName>EURO</CurrencyName><ForexBuying>.*</ForexBuying><ForexSelling>(.*)</ForexSelling>~isU',$sayfa,$cikti);
    $euro       = $cikti[1];
    
    return ($euro);
}
function cache($dosyaadi){
    global $cache_suresi;
    if(filemtime($dosyaadi)+$cache_suresi<time()){
        $dosya = fopen($dosyaadi, 'w');
        $veri  = $this->veri();
        fwrite($dosya, $veri);
        fclose($dosya);
        return $veri;
    }else{
        $dosya  = fopen($dosyaadi, 'r');
        $icerik = fread($dosya, filesize($dosyaadi));
        fclose($dosya);
        return $icerik;
    }
}
}

$onbellek      = new onbellek();
# kurlar.txt dosyasının chmod ayarını 777 yapmayı unutmayın!
echo $onbellek->cache('kurlar.txt');
?>