Cache (Önbellekleme) sistemi ile sitenin kaynak tüketimi azaltılarak site açılış hızını arttırmak ve site performansı konusunda daha verimli bir sistem ortaya çıkarmak amaçlanır. Bu doğrultuda bu yazıda basit bir şekilde sitenin her sayfası için ayrı ayrı dinamik PHP cache yapımı ve nasıl kullanılacağı konusunu göreceksiniz.
Web sitesi geliştirildikçe kod satırları ve sorgu sayısı sürekli artacaktır. Bu kodların sitenin her açışılında çalışması halinde sitenin barındığı sunucuya ek yük binecek ve dolayısıyla sitenin performansını olumsuz etkileyecektir. Site hızlandırma adına kod, sunucu, sorgu ve resim optimizasyonu gibi birçok teknik uygulansa bile sitenin açıldığı her seferde tüm bu kod, sorgu ve işlemler gerçekleşirse, bu durum sitenin hızının azalmasına ve ziyaretçi sayısı arttıkça bu hız düşüklüğünün daha fazla hissedilmesine neden olacaktır.
Mesela paylaşımlı hosting üzerinde çalışan cache sistemi olmayan bir site daha fazla kaynak tüketecek, sitenin ziyaretçi sayısı arttıkça mevcut hosting yetmeyecek ve normalden daha erken bir süreçte VPS veya VDS server gibi ek maliyet gerektiren bir sisteme geçilmesi gerekecektir.
Web sitelerinin yükünü azaltmak için birçok cache türü bulunmakta. Tarayıcı cache, sunucu cache, veritabanı tarafında cacheleme ve dosya cache akla ilk gelenler arasında.
Bu yazıda, bu cache türleri arasında tarayıcı önbellekleme ve PHP dosya cache (file cache) konusunu göreceksiniz. File cache sistemi ile sayfa açılırken gerçekleşen işlemler sonucunda hazırlanan nihai HTML sonuç, belirtilen dizinde belirtilen süre kadar dosya halinde saklanır ve bu süre boyunca artık veriler bu dosyadan çekilir.
Site her açıldığında sayfayı oluşturan kod ve sorguların defalarca kere çalışması yerine daha önceden oluşturulmuş olan bu dosya direkt çağrılır ve sunucunun her seferinde aynı işi yapmasına gerek kalmaz.
Cache nedir ve neden kullanılır konularını açıklığa kavuşturduktan sonra şimdi dinamik php cache yapımı konusuna bakalım.
PHP File Cache Yapımı
Dinamik bir şekilde PHP cache yapımı kodları aşağıdaki gibidir. Kod satırlarında gerekli açıklamaları görebilirsiniz.
$cache_klasor = './cache/';
$dosya_isim = md5($_SERVER['REQUEST_URI']);
$dosya_yolu = $cache_klasor.$dosya_isim. '.html';
$cache_suresi = 3 * 60 * 60; // cache süresi 3 saat
if (file_exists($dosya_yolu)){ // cache dosyası var ise
// filemtime() = dosyanın son düzenlenme zamanını bulur
if(time() - $cache_suresi < filemtime($dosya_yolu)){ //cache dosyasının süresi bitmediyse
readfile($dosya_yolu); //dosyayı oku
exit; //aşağıdaki satırları okuma
}else{ // cache süresi doldu ise
unlink($dosya_yolu); //dosyayı, cache sil
}
}
ob_start();
echo 'Burada cachelenmesi gereken kod ve içerikler olması gerekiyor';
$sayfa_verisi = ob_get_contents(); //sayfanın sonuç çıktısını al
ob_end_flush();
$dosya = fopen($dosya_yolu, 'w+'); //cache dosyasını aç
fwrite($dosya, $sayfa_verisi); //dosyaya yaz
fclose($dosya); //dosyayı kapat
Yukarıdaki PHP cache yapımı örneğinin işleyişi;
- Önbelleklenmesi istenilen sayfanın URL adresi PHP md5 şifreleme ile şifreleniyor. Şifrelenmiş bu veri, oluşturulacak cache dosyasının ismi olacak. Her sayfanın ayrı URL adresi olacağı için ayrı ayrı sayfalar için ayrı ayrı dosya oluşturularak dinamik cacheleme yapılmış oluyor.
- PHP file_exist fonksiyonu ile bu şifrelenmiş isme sahip bir dosya “cache” klasöründe mevcutmu kontrol ediliyor.
- Mevcutsa dosyanın oluşturulma zamanı, PHP tarih saat fonksiyonları içerisinde yer alan ve PHP time fonksiyonu ve dosyada son değişiklik zamanını döndüren filemtime fonksiyonu ile kontrol ediliyor.
- Dosya silinmediyse readfile fonksiyonu ile dosya içeriği okunuyor ve yazdırılıyor. Eğer dosya oluşturulduktan itibaren 3 saat geçtiyse dosya siliniyor ve ob_start fonksiyonundan sonra tanımlanan ob_get_contents fonksiyonu ile sayfa içeriği elde ediliyor.
- Ardından fopen fonksiyonu ile dosya oluşturma ve açma işlemi yapılıp, PHP dosyaya yazma komutu olan fwrite fonksiyonu ile sayfa içeriği dosyaya ekleniyor.
- Dosyaya eklenen içerik sayfanın ob_start() fonksiyonu ile ob_end_flush() fonksiyonu arasında kalan bölgedeki HTML sonuç çıktısıdır.
Böylelikle 3 saatte bir cache işlemi yerine getiriliyor. Cache dosyası 3 saatte bir güncelleniyor.
PHP Cache Dosyalarını Silmek
Rmdir fonksiyonu kullanarak cache dosyalarının barındığı klasör silinmek istenirse bu malesef çalışmayacak. Bunun sebebi, rmdir ile sadece boş klasörlerin silinebiliyor olmasıdır.
PHP dosya silme işlemi unlink fonksiyonu ile yapılabilir. Array_map fonksiyonu ile “cache” klasöründeki dosyaları döngüye sokarak unlink fonksiyonu ile dosyaları silebiliriz.
array_map('unlink', glob('cache/*')); // Cache klasörü içerisindeki bütün dosyaları sil
array_map('unlink', glob('cache/*.html')); // Cache klasörü içerisindeki sadece .html uzantılı dosyaları sil
Array_map fonksiyonu kullanmak istemezseniz aşağıdaki fonksiyonu kullanabilirsiniz.
function klasor_temizle() {
$klasor = 'cache/';
$ac = opendir($klasor);
while ($dosya = readdir($ac)){
if($dosya != '.' && $dosya != '..' && pathinfo($dosya)['extension'] == 'html'){
$dosya2 = $klasor.$dosya;
if(is_dir($dosya2)){
klasor_temizle($dosya2);
rmdir($dosya2);
}else{
unlink($dosya2);
}
}
}
closedir($ac);
}
klasor_temizle();
PHP Tarayıcı Önbellekleme
Tarayıcı tarafından site önbellekleme yapılabilir. Aşağıdaki kodu “.htaccess” dosyanıza ekleyerek başta “jpg, gif, png, css, js” uzantılı dosyalarınız olmak üzere birçok elementin tarayıcı tarafından önbelleklenmesini sağlayabilirsiniz.
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 7 days"
Bir kullanıcının siteye birden fazla giriş yaptığı durumlarda belirtilen bu dosyaların her seferinde sunucudan yüklenmesini engellemiş olursunuz. Tarayıcı önbellekleme açık olduğu zaman bu dosyalar kullanıcının tarayıcında depolanır ve dosyaların tekrar tekrar yüklenmesi engellenmiş olur.
PHP Tarayıcı Önbelleğini Silmek
Web site geliştiricilerini tarayıcı önbellekleme işlemi bazen şaşırtabilir. Yapılan değişikliklerin yansımadığını görebilir, yaptıklarının işe yaramadığını düşünebilirler. Bilmeyenler olabilir, “ctrl + F5” kombinasyonu ile kendi tarayıcınızda açık olan sitenin tarayıcı önbelleğini silebilirsiniz. Tarayıcı geçmişini silme yoluyla da önbelleği temizleyebilirsiniz.
Ayrıca css, js ve resim gibi dosyaların bağlantı adreslerinin değişmesi halinde yeni bir dosya olarak algılanacağı için önbellekleme yapılmasını istemediğiniz bu gibi dosyaların bağlantılarını aşağıdaki gibi sayfa her açıldığında değiştirerek, sayfa her yüklendiğinde yeni ve güncel bir dosya yüklüyormuşsunuz gibi tarayıcıya dosyalarınızı tanıtabilirsiniz.
PHP tarafında ise aşağıdaki kodları kullanarak PHP ile tarayıcı cache silme işlemini yapabiliriz.
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-Type: application/xml; charset=utf-8");