Öncelikle Sorumuz Şu Olmalıdır
Neden Cache Sistemi Kullanmalıyım ?
Siteniz hit aldığında sunucuda sorunlar çıkardığı zaman
Mysql overload olduğunda
Cpu kullanımı arttığında
Host Bulamaz Hale Geldiğinizde
Yada kendi sunucunuz olsa dahi sitenize girmeye
korktuğunuzda ( ya ben siteye girince sunucu çökerse dediğinizde)
İşte cache sistemindeki amacımız kaynak tüketimini en aza indirmek
Yukarda saydıgım durumların en feci olanı mysql sunucu özellikleri düşük ise
Siteyi 4 5 defa yenileyince mysql tavan yapıyor O hiç sevmediğin olay Olur
Databaseye Bağlanamadım
Konu fazla uzadı sanırım r10 da açılan konuda hakimi arkadaşımız
Burada basit bir cache betiği yayınlamış
yazmış olduğu betikte ufak bi güvenlik açığı vardı biraz düzenledim betiği
Betik 2 Kısımdan Oluşuyor birinci kısım sayfanın en üstüne yazılacak kısmı
2 kısım ise sayfanın en altına yazılacak kısmı
Aşşağıdaki kısmı sayfanın en üstüne yazılacak kısmı
<?
$filename = "%%-".md5($_SERVER['REQUEST_URI'])."-%%.html";
$cachefile = "cache/".$filename;
$cachetime = 3 * 60 * 60; // Cache Süresi
if (file_exists($cachefile))
{
if(time() - $cachetime < filemtime($cachefile))
{
readfile($cachefile);
exit;
}
else
{
unlink($cachefile);
}
}
ob_start();
?>
Aşşağıdaki kısmı isi sayfanın en altına yazılacak kısmı
<?
$fp = fopen($cachefile, 'w+');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
?>
Temel Olarak Betiğin Ne işlev gördüğünü açıklıyayım basit Bir şekilde
Herhangi bir ziyaretçi sitemizi ziyaret etti örnek verecek olursak
http://www.sitemiz.com/mysql-php-ajax.html
cache betiği url yi alıyor ve isimini md5 liyor ve $cachefile diye bir değişkene atıyor
ve daha sonra sayfanın en altına eklediğimiz
$fp = fopen($cachefile, 'w+');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
Php Kodları $cachefile dosyasını yazılabilir şekilde açıyor ve sayfa içeriğini
yazıyor Tekrar Bir ziyaretçi
http://www.sitemiz.com/mysql-php-ajax.html
yazıp sitemizi ziyaret ettiğinde üstü yazdığımız php kodları devreye giriyor
if(time() - $cachetime < filemtime($cachefile))
{
readfile($cachefile);
exit;
}
Şimdiki zaman ile dosya zamanı arasındaki fark cache süresinden kücük ise readfile
ile daha önce kaydetmiş olduğumuz html dosyasını ziyaretciye gösteriyor
Bizim burdaki Kazancımız sitemize giren 2. ziyaretci izin mysql sorguları php sorguları yerine
daha önce kaydetmiş olduğumuz html dosyasını gösterdik ve kaynaktan tasarruf ettik :)
Umarım Anlatabilmişimdir unutmadan cache süresini $cachetime değişerek kendinize göre ayarlayabilirsiniz
$cachetime = 3 * 60 * 60; // Cache Süresi 3 saate
10 yorum:
En çok yaşadığım sıkıntılardan biriydi, hemen uyguluyorum teşekkürler Salih
Onarcade sistemde kullanıcam , gerçekten işe yarar bir metod, Teşekkürler.
çok güzel bi olay teşekürler... birde şu satırı açıklarmısın
$filename = "%%-".md5($_SERVER['REQUEST_URI'])."-%%.html";
%% işaretlerinin anlamı ne
erkan %% işaretleri genelde veritabanında arama yapmak için kullanılır
Örneğin name değişkeninden gelen içeriği aratıyorsunuz veritabanınında
eğer mysql sorgusunda name'ni sonuna % bu işaretyi koyarsan sonunda o kelime geçen içerikleri getirir.
Eğer başına koyarsan başında o kelime geçen içerikleri çeker.
2 tarafada koyarsan kelimeyi olduğu gibi aratır.
Eline sağLık işime yaradı :)
Salih teşekkür ederim. Fakat en uygun cache time ne olmalıdır? Yada neye göre nasıl farklılıklar gösterir? Cachetime özniteliğini biraz açıklarmısın?
oncelikle yaziniz icin tesekkur ederim.
belki
$filename = "%%-".md5($_SERVER['REQUEST_URI'])."-%%.html";
satirini
$filename = "%%-".md5($_SERVER['REQUEST_URI'].'SALT')."-%%.html";
gibi degistirip, SALT yerine herhangi bir text girerek daha guvenli hale getirebiliriz.
Merhaba hocam. Elinize sağlık. Çok güzel oldu .
Fakat benim sorum var. Ben yarı dinamik sayfamda, dinamik olmayan bölümünde cache kullanmak istiyorum.
Örnekle; üye girişi yapılarak ulaşılan sayfamda headerda hoş geldin ahmet yazacak. (Kullanıcı adı dinamik) Onun altındaki bölümde 3 saatte bir güncellenen rastgele resimler sıralanacak.
Rastgele resimler icin her istemde veritabanına sorgu yapmak istemiyorum. Belli bir sırada da getirmek istemiyorum. Yapı gereği rastgele olması gerekli.
Bu durumda komple sayfayı cachelesem baska bir üye (adı ayse olsun) kendi panelinde o resimleri kendinden önceki ahmet in gördüğü sırada görecek resimleri ama hoş geldin Ayşe değilde bir önceki ahmetin ismi yazacak login olarak ulaştığı sayfada bile?
Bu durumda napabiliriz?
Soruma cevap atıldıgında mailime cevap verildi seklinde mesaj atarsanız cok sevinirim. saygılar.
mailim->malisabuncuoglu(at)gmailcom
Benim sayfalar .php ile bitiyor o html yi php olarak değiştirirsemolur mu
php veya html diye bitmesi onemsiz siz sayfaya girdiginizde o sayfanin icine html dosyasini cagiriyor yani diyelim
haber1123.php girdiniz.
ilk girisse haber11123.html diye bir dosya olusuyor ve
birdaha haber1123.php ye girdiginizde bu dosyanin icine haber1123.html dosyasini yaziyor.
Yorum Gönder