Kategoriler
Php fonksiyonlari Webmaster yardım

Php ile cache sistemi [Basit ve degisken File cache]

Daha oncede yazdigim bir konuydu, simdi sizlere iki baslik altinda konu hakkinda detay verecegim.
1 – Sabit ve degismeyen sayfa cacheleme
2 – >devamli degisen ayni kalmayan sayfalari cacheleme

1. konudaki cache ile 1-2 sayfanizin cachesini almak istediginizde kullanabileceginiz bir sistem olarak karsiniza cikacak. Cok fazla degisen siteniz yoksa, belli sayfalarda cok fazla sorgu varsa veya fonksiyon, bunlarin sunucuya yuk oranini en aza indirgemek icin kullanilabilir.

Bu 1. konudaki basit cache olayina ornek vermek gerekirse bu siteye bakabilirsiniz: http://www.videolin.com

sadece ana sayfasinda kullandigim cache kodlari hem acilisin hizini hemde kullandigim bir kac php ve sql sorgusunun siteye yuk getirmesi, yavas acilmasi gibi bizi zor duruma dusurecek sorunlardan kurtarmaktadir.

Basit Cache Mantigi:

Kullanacagimiz cache sisteminin nasil isledigini anlatarak baslamakta yarar var. Kisaca sayfanin uzerine ve altina yerlestirdigimiz bir kac php kodu sayesinde orta kisimda olusan sorgular, fonksiyolar gibi olaylari tek bir dosyada toplayarak, 2. kez cagrildiginda bu dosyadan yardim almasi diyebiliriz.

Ozetle mantigin basit isleyisi:

Ziyaretci siteye girer —-> sayfayi once cache varmi kontrol eder —-> cache yoksa cache alir, varsa cache dosyasindan yukler

FAydasi: 2. kez cagliral sayfa cachelendigi icin php ve sql sorgularini calistirmadand irek cacheye alinan sabit html kodlarini cagiracak ve sayfaya isleyerek bize gosterecektir.

bu sayfa acilisini %50 sunucuyu yorma, kasma gibi olaylarida %60 azaltir..

Tek sayfalik Basit Cacheye ornek:

yukarida bahsettigim 1. konuda ve basit cache mantiginda kullanilacak kodlar asagida verilmistir:

$cachedosyasi = "cache/index.kuaza";
if (file_exists($cachedosyasi)) {
include($cachedosyasi);
exit;
}
ob_start();
<!-- Php kodlari ve mysql sorgulari -->
$ch = fopen($cachedosyasi, 'w');
fwrite($ch, ob_get_contents());
fclose($ch);
ob_end_flush();

 

yukaridaki kod genel olarak bir cache alma sisteminin ana mantigini olusturmaktadir.
sirasiyla:
cache dosyasini tanimliyoruz
cache dosyasini kontrol ediyoruz
varsa cacheyi cagiriyoruz ve islemi sonlandiriyoruz
cache yoksa kodlar arasindakileri html olarak cacheliyoruz
sonrasinda islem en basa doner..

Eger bu cachede zaman siniri eklemek istiyorsaniz, yani belli araliklarla dosya belirlediginiz sureden eski ise yenilenmesini saglamak isterseniz kucuk bir zaman kontrol kodu ile islemi basarili bir sekilde saglamis olursunuz. Bu ornekde asagida renklendirilerek verilmistir:

$cachedosyasi = "cache/index.kuaza";
if (file_exists($cachedosyasi) && (time() - 2700 < filemtime($cachedosyasi))) {
include($cachedosyasi);
exit;
}
ob_start();
<!-- Php kodlari ve mysql sorgulari -->
$ch = fopen($cachedosyasi, 'w');
fwrite($ch, ob_get_contents());
fclose($ch);
ob_end_flush();

 

Yukaridaki renkli kisimda bulunan 2700 ibaresi saniye cinsinden hesaplamak icindir. eger cache alindan dosya 2700 saniyeden eski ise yenisini olusturmaktadir.

cachelenecek alanida ob_start(); acip ob_end_flush(); kodlariyla bitiriyoruz, ve arada kalan sorgular, fonksiyonlar saf htmlye cevrilerek cache alinmis olur.

Degisen Sayfalar icin cache mantigi:

SAbit kalmayan ve devamli olarak get, post methoduyla degisesen sayfalariniz olabilir. Yada bu metodlarin disinda TEK bir dosyadan birdan fazla icerige hukmediyorsaniz basit cache sistemi etkisiz kalacaktir. Cunku ayni dosya uzerinden cachelenen dosya 1 tane olacagindan ve ayni isimde kalacagindan, baska konuda sayfa cagirdiginda onceki cache alinan sayfayi gostereceginden isinize yaramayacaktir. Ancak cachelenen dosya ismini adres satirindaki urlye yada sayfaniza gelen get,post metodundaki bir veriye gore yaptirabilirsiniz. boylece her sayfa degistiginde o sayfaya ait cache alinir. Ornek vermek gerekirse video siteniz var ve bu video sitesinde tek dosyadan islem yaptirarak milyonlarca video gosteriyorsunuz ziyaretcilerinize.
soyle ornek bir kac link gostereyim ben size:

  1. http://www.videof.net/video/kffacxfA7G4/Justin_Bieber__Baby_ft_Ludacris.html
  2. http://www.videof.net/video/uhLhdKGINzU/Usher__OMG_Official_Video.html
  3. http://www.videof.net/video/ZM3CYEdr5fA/Bruce_Springsteen__Eyes_on_the_prize_LIVE_in_DUBLIN.html
  4. http://www.videof.net/video/Pdw27j_usP0/maNga__We_Could_Be_The_Same_Turkey.html

yukarida verdigim linkler tek bir dosya uzerinden gosterilmektetir ve bu tarz siteler ve sistemler icin kullanilacak en guzel cache yontemi url yada adres satirindan gelen isteklerin cache edilen dosyaya eklenmesidir. Ben bu sitede verdigim ornek linklerde cache kullanmiyorum, cunku sunucu kasacak bir yapida degil. ancak sunucuyu mahfedecek duzeyde fonksiyon ve sql sorgusu barindiran sistemlerde kullanmanizi oneririm. Dilerseniz boyle bir sistemde kullanilacak cache kodlarini paylasarak aciklamaya gecelim.

$cachedosyasi = "cache/".md5($_SERVER['REQUEST_URI']).".kuaza";
if (file_exists($cachedosyasi) && (time() - 2700 < filemtime($cachedosyasi))) {
include($cachedosyasi);
exit;
}
ob_start();

<!-- Php kodlari ve mysql sorgulari -->
$ch = fopen($cachedosyasi, 'w');
fwrite($ch, ob_get_contents());
fclose($ch);
ob_end_flush();

 

Yukaridaki ornek benim kullandigim mantikla ayni urlden aldigim bilgiyi md5 ile sifreleyip cache ediyorum. Boylece sacma karakterler varsa cache ederken sorun cikartmasini engelliyoruz.

Eger adres satirindaki urlye gore degilde gelen get yada post daki bilgilere gore cache yapmak isterseniz yukaridaki koddaki: $_SERVER[‘REQUEST_URI’] kismini bunlardan biriyle degismeniz yeterli:
$_GET[‘GETMETODU’] yada $_POST[‘POSTMETODU’]

Boylece cache alirken ayni adres urlsiyle yada ayni get veya post bilgisiyle karsilastiginda cache ettigi onceki dosyayi cagirecektir. ve boylece herzaman ayni dosyayi ziyaretciye gostermeyecektir..

Koydugumuz zaman sinirinida dilediginiz sekilde dusurebilir yada uzatabilirsiniz. Ben saniye cinsinden yazdim. Varin siz hesaplayin gerisini :)

Bu arada kodlari kullarnirken dosya yolunu gosterirken kullandigim cache/… yolunu olusturmaniz gerek yoksa cache almaz, hatada verebilir. olusturduktan sonra cache klasorunuze chmod 777 ayarini verirseniz sorunsuz sekilde cache olusturup, silip yeniden kaydedebilir..

***

Bu dokumanda herhangi bir yanlis bilgi yada tutarsiz gordugunuz yerler varsa yorum olarak duserseniz en kisa surede duzenlemeye calisirim..

Yanlisim olduysa simdiden kusuruma bakmayin..

Yazar selçuk KILIÇ

Bende 1 yumurta var, sende 1 yumurta var. Ben sana 1 yumurta versem, sen bana bir yumurta versen, bende 1 yumurta sende 1 yumurta olur.Bende 1 bilgi var, sende 1 bilgi var. Ben sana 1 bilgi versem, sen bana 1 bilgi versen, bende 2 bilgi, sende de 2 bilgi olur - Konfüçyüs - Yazilarimi artik kuaza da yayinliyorum (zamanim oldukca) :)

“Php ile cache sistemi [Basit ve degisken File cache]” için 21 yanıt

Şöyle olabilir.

$cachefile = “cache/”.md5($_SERVER[‘REQUEST_URI’]).”.html”;

$cachetime = 5 * 60 * 60; // Cache Süresi
if (file_exists($cachefile))
{
if(time() – $cachetime < filemtime($cachefile))
{
readfile($cachefile);
exit;
}
else
{
unlink($cachefile);
}
}
ob_start();

Bu cache sistemini curl ile çalışan bir sayfaya uyarlayamadım yardımcı olabilir misiniz. Kodlarım şu şekilde.

$t= $_GET[“link”];
function get_data($url)
{

$ch = curl_init();
$timeout = 5;

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
curl_setopt($ch,CURLOPT_REFERER,”http://www.dailymotion.com”);
curl_setopt($ch,CURLOPT_USERAGENT,”googlebot”);
$data = curl_exec($ch);

curl_close($ch);
return $data;
}

$veri3=get_data($t);
preg_match(‘##si’,$veri3,$ali);
$degis = urldecode($ali[1]);
header(“Location: “.$degis);

sitemde /osman.php diye bir sayfa açıp indexi verdiğiniz kod eşliğinde birleştirip nasıl bir yapı oluştuğunu görmek istedim. theme yolunu {theme] şeklinde belirtildiği için css hatası verdi yapıyı bozmakta istemiyorum.

/osman.phptemplates/ şeklinde bir hata beliriyor.

Sistem DLE dir.

DLE sistemleri smarty tema yapisini kullaniyor diye biliyorum ben. Yanlisim yoksa tabi :) Bu sistemlerin kendine has (burdaki sisteme yakin ama daha profesyonel bir kod yapisinda) cache uygulama yapilari mevcut olmasi gerek.

Form alan sayfalarda yani post yada get olayında sorun çıkmaz mı.
Şöyleki;

Bir iletişim sayfası düşünelim: http://www.makaleci.com/iletisim.php
bu sayfadaki formu doldurdum ve gönder dedim post ile attım veriyi.
cacheleme sistemi iletisim.php daha önce cache lendiği için direk işlenmiş kodu getirecek ve benim gönderdiğim veri kısmı çalışmayacağı için gönderilemeyecek.

merhaba hocam benim bir sorum olacak. Sitemde cache sistemi kullanıyorum ama sitemde yapılan yorumlar da cacheleniyor. Yani yapılan yorumlar bir saat gecikmeli görünüyor. Yorumlar haric diğer sayfaları cachelemek istiyorum. Yani yorumlar ananda sitede görünsün diğer yerler cachelensin. Bunu nasıl yapabilirim.

Yeni yorum yapildiginda bir fonksiyon hazirlayin o devreye girsin ve yorum yapilan sayfanin cache dosyasini silsin. Boylece yeni yorumlu hali cache alinacak her defasinda ve gecikmeli gosterim sorunu cozulecektir.

merhaba,
sayfa bulunamadıysa cache almasın, nasıl yaparız? örn: site.com/aslkdjaslk.html, site.com/k14j.html falan gibi boş yere şişmesin?

Hata sayfalari icin ozel bir dosya yapacaksiniz o zaman, hatali yada bulunamayan bir dosya olursa o sayfa acilacak. O sayfada da cache kodlarini kullanmazsiniz.

bunu yapmak icin .htaccess icerisinde 404 hatasi icin kod eklemeniz gerekli.

değişken cache demişsiniz, ben onu göremedim, mesela video sayfalarım var, sabit diyebileceğim, fakat googleden gelen aramaları mysql a ekletiyorum, haliylede sitede göstermek istiyorum, bu sistemde, sabit bir şekilde o sayfa kalıyor. Bunun bir çözümü var mı ? değişken yapılabilme yani ? 12 saat zaman ayarlı yada 24 saat ayarlı gibi.

Merhabalar. Çözümünüz için çok teşekkür ederim :) Kodda biraz oynama yapıp süresi geçmiş dosyaları otomatik sildirme fonksiyonu elledim sistem enfes oldu. Cache silmek için vs. uğraşmıyorum kendisi arka planda hallediyor her şeyi.

vedat için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.