PHP Cache Yapımı Nasıl Yapılır?

Dinamik bir şekilde PHP cache yapımı kodları aşağıdaki gibidir. Kod satırlarında gerekli açıklamaları görebilirsiniz.

PHP Cache Yapımı Nasıl Yapılır?
PHP Cache Yapımı Nasıl Yapılır?
$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.

<IfModule mod_expires.c>
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"
</IfModule>

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.

<link rel="stylesheet" href="style.css?versiyon=<?php echo time() ?>" type="text/css" media="all">
<img src="resim.png?versiyon=<?php echo time() ?>" />

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");

kaynak: https://muhammedyaman.com/php-cache-yapimi/