Konunun detaylarina baslamadan once webmaster arkadaslara bir kac goudum ve nasihatim olacak. Haddim olmayabilir ancak bunu bir nevi dikkate almaniz hepinizin yararina olacaktir.

Webmaster: Bir script kodlarken, hazirlarken mumkun oldugunca sorgu sayisini kisitli tutun yada bu tarz sistemlerde hava, su kadar degerli olan cache sistemlerini kullanin. Yoksa kendini hazirlayin. Bir kac mantikla yapilmayacak sey yoktur.

Alici: Bir script alirken, dikkat edin, yaptigi sorgu sayisi baslarda farkedilmeyecek kadar az olabilir, ancak yuksek hitlerde sunucunuz dahi dayanamayacak noktaya gelecektir. Ya kilitlenecek yada is yapamaz halde yavaslayacaktir.

Yanlis kodlama, php’nin urettigi hata kodlari, yuksek boyutlarda sorgu sayisi, mysql sorgularindan bahsediyorum, baslarda hitiniz 10-20 kisiyken farkedilmezdir. ancak hitiniz 500-1000 tekil e ciktiginda, anlik olarak gelen her kisi scriptteki hatali kodlari tekrar calistiracaktir, yada cok fazla sorgu varsa her kiside ayri sorgu sayisi ortaya cikacagindan sunucunuz, hostunuz kisa surede susptende olur, yani kapanir.

Buna ornek vermek gerekirse sistemine asina oldugum wordpress i secmek istiyorum: WordPress sistemini aslinda herkes yuksek hitlerde sistemi kastigi, zorladigi, kilitledigi sekillerde bilirsiniz. Aslinda oyle degildir. Standart wordpress temasinda ana sayfa sorgu sayisi 25 lerde iken, prof. bir magazine temasinda bu sayi 150-200 lere kadar cikar.. bu ornektir, 50 de olur, 100 de. Burada anlik hitiniz 50 ise sunucunuz aninda kilitlenecektir, yada inanilmaz bir yavaslama olacaktir. sebebi ise cok fazla sorgu sayisi ile hem apache ye, hemde apacheden cok mysql programina yuklenmeniz. sonucunda bunu makine kaldiramaz ve kilitlenir. sitenize bir sure ulasilamaz.

Bu kadar uzun bir baslangic yazmamin sebebi, konuyu daha iyi kavrayabilmeniz arkadaslar. Yuksek sorgular hostu oldurur, o olurkende siz bitersiniz.. Bunu dedigim gibi baslarda anlamazsiniz, ama ilerde cok kotu sekilde hissedersiniz..

Yakin zamana kadar bende bu konuda sorgu azaltma calismalari yapiyordum, ancak cache sistemi bu konuda tam aradigim seydi. sitenize giren bir kisi 200 sorgu varsa temada onu calistirir, sonrasinda cache ile sayfa komle cacheye alinir. sonrasinda girenlerin hepsi sorgu calistirmaz, cache edilen HTML dosyasini calistirir. Bu sekilde anlik 50 kisi varsa 50 kiside HTML bir dokuman calistiracaktir, yani mysql ye yuklenmede %85 e varan dususler olacaktir. Bu sitenizin guncelligine gore degisir, cok az guncellenen bir siteniz varsa cache sistemi sizin can damariniz olacaktir.

Yuksek sorgulu temalardan birisi de KuazaHaber temasidir. bunu farkettigimde sorgu azaltma yoluna gittim, bu seferde tema temaliktan cikmak uzereydi, neden cache denemeyeyim diye icimden gecirdim. Hali hazirda cache eklentileri istedigim gibi degildi, sistemi kasmasinin yaninda pekde gozle gorulur bir faydasini farkedemedim ben.

Sonuc olarak 150 ye varan sorgu sayisi cache sistemi sayesinde 11 e dustu. Bu 11 sorguda sitenin en ust kismindakiler, menuler. ondan asagisini cache ile sayfaladigim icin her giren HTML olarak bunu goruyor, ve sorgu yapmiyor sunucumuza..

Tamam kuaza uzatma dediginizi duyar gibiyim, yukarida yazdiklarimi kavradiginizi umid ederek asil konumuz olan sisteminizi cache ile kurtarabileceginiz konuya giriyorum..

CAche sistemine giris:

Cache kodlari 2 kisimdan olusur.

  1. kisim en ustte cacheye alinan, baslanan yer.
  2. kisim cachenin kapatildigi yer.

eger cache ile calisiyorsaniz 2. kisimdan sonrasini sitede gosteremeyeceginizi bilmenizi isterim. bu sebeple mantik kullanarak kendi sisteminizi gelistirebilirsiniz

Yani daha kolay anlayabilmeniz icin bir ornek vermek istiyorum:

<Cache kodlari>

kodlariniz, sorgulariniz

</cache kodlari>

bu sekilde kodlarinizi yerlestirdiginizde aradaki sorgular cache ye alinir. En guzelide cache ye sure koyabiliyorsunuz. yani cache edilen dosya 15 dk dan eski ise yenisi ile degistirilir.

ben size dakikali olarak cache alma kodlarini paylasacagim, sonrasinda aciklamasini yapacagim, dikkatle takip edin:

Cache ust kisim kodlari:

$cache_dosyasi= “kuaza_anasayfa”;
$cachefile = “cache/”.$cache_dosyasi.”.html”;
$cachetime = 60 * 60; // 60 * 60 = 1 saat
if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) {
include($cachefile);
echo “<!– Kuaza onbellek sistemi “.date(‘jS F Y H:i’, filemtime($cachefile)).” –>n”;
exit;
}
ob_start();

yukaridaki kod dan sonras cache almak istediginiz kodlar geliyor.

en alt kismida asagidakileri ekleyerek cache leme islemi icin sayfa araligimizi belirliyoruz:

Cache alt kisim kodlari:

$fp = fopen($cachefile, ‘w’);
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();

Iki kodu birlestirerek bir ornek vermek istiyorum. Eminim sonrasinda mantigi anlamis olursunuz:

$cache_dosyasi= “kuaza_anasayfa”;
$cachefile = “cache/”.$cache_dosyasi.”.html”;
$cachetime = 60 * 60; // 60 * 60 = 1 saat
if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) {
include($cachefile);
echo “<!– Kuaza onbellek sistemi “.date(‘jS F Y H:i’, filemtime($cachefile)).” –>n”;
exit;
}
ob_start();

echo “kuazadan selamlar arkadaslar. bu echo ettigimiz yazi cache sistemi sayesinde cache klasorune html olarak kaydedilecek. burada php yada sql sorgularida kullanabilirsiniz, sizin gordugunuz sekilde cachelendigi icin sonraki acilmasinda sorgu degil html sayfa karsiniza cikacaktir :)”;

$fp = fopen($cachefile, ‘w’);
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();

bu kodlari tabiki <? php …. ?> kodlari arasina almaniz gerek sonrasinda calistirdiginizda orta kisimda echo ettigimiz yazi daha acmis oldugunuz cache klasorune html seklinde yani bu isimde: kuaza_anasayfa.html kaydedilecektir.

bu islemin saglikli yapilabilmesi icin, oncelikle cache klasorunun chmod ayarinin 777 olmasi gerek.

Birazda kodlardaki alanlardan bahsedelim:

$cache_dosyasi= “kuaza_anasayfa”;

Yukaridaki alinti yaptigim kod kisminda kuaza_anasayfa ismini degiskene atiyoruz ve sonrasinda bunu cachefile degiskeni kisminda kullaniyoruz. Bunu bu sekilde eklememdeki sebep wordpress yada farkli bir scripte daha cabuk uyarlanabilmesidir. Girilen sitedeki get yada post methodu ile gelen bir veriyi alarak degiskene atarsiniz sonrasinda bunun isminde cache dosyasi yaratilir. sonraki zamanlarda ayni post yada get metodundan ayni bilgi gelirse cache dosyasi gosterilecektir. hayir farkli bir sey gelirse o isimde yeni bir cache olusturacaktir.

Ben bunu tam anlayabilmeniz icin wordpress den ornek vermek istiyorum: WordPress de yazi okuma sayfasina girdiginizde aslinda p=YAZI IDSI seklinde bir link olusur.. Siz buradaki p= den sonrasini get metodu ile cache kismana alip degiskenimize yazdirirsaniz, o yaziya ait cachemiz olmus olur. Sonrasinda girilen diger yazilar icinde o ID de farkli bir cache olusturacagi icin sitenizin cogu sayfasi cachelenecek ve gelen ziyaretciler size zarar degil, kar getirecektir..

Ornegin kendi sitem olarak hdvideoclip.com da ana sayfa ve video izleme kisimlarinda cache kullaniyorum, yukaida bahsettigim sekilde ve inanilmaz hizli aciliyor sayfalar. Sonucda sorgu olmadigi icin html sayfa aciliyor. Bu hem ziyaretciyi size baglar, hemde hostunuz, sunucunuz sorgu sayisinin fazlaligindan kasilmaz.

o sitede ornek bir videoya bakin: timbaland-scream-ft-keri-hilson-nicole-scherzinger-9319.html

acilisi nasil ? Turkiyede iseniz youtube yasak oldugu icin yavaslamalar olabilir, yada siz acarken biz saldiri aliyorsak yavas acilabilir. onun haricinde hizini gormenizi isterim.

sistem wordpress bu sebeple once o sayfanin ID sini degiskene atiyorum. Ornek:

$cache_dosyasi = $konuIDSI;

Sonasinda da bu sekilde kullaniyorum:

$cachefile = “cache/yazi-“.$cache_dosyasi.”.html”;

ve cacheye kaydetmesi bu sekilde oluyor: yazi-KONU IDsi.html

Cache dosyasinin ne kadar surede CACHE de kalacagini ise burada belirliyoruz:

$cachetime = 60 * 60; // 60 * 60 = 1 saat

10 dk da bir cache alsin istiyorsaniz bu sekilde yapin:

$cachetime = 10 * 60; // 10 * 60 = 10 dakika

Buradaki 60 = 60 saniyedir, yani 1 dakikadir. bu sekilde hesaplamanizi yapabilirsiniz.

sonrasinda da cacheden aldigimiz saat bilgisini belirledigimiz sure ile karsilastiriyoruz ve gecmis ise yeni cache almasini, gecmemis ise cacheyi gostermesini istiyoruz:

if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) {
include($cachefile);
echo “<!– Kuaza onbellek sistemi “.date(‘jS F Y H:i’, filemtime($cachefile)).” –>n”;

Yukarida da yazdigim gibi, yukaridaki kod tarihleri ve saatleri karsilastiriyor, belirledigimiz dakikanin ustunde degil ise cacheyi gosteriyor, ustunde ise buradan tekrar basliyor cache almaya: ob_start(); ve buradan da bitiriyor: ob_end_flush();

Ben wordpress den ornek verdim, kullandiginiz her sisteme entegresi cok basit bir kod uygulamasidir bu. Bu kalibi kullanarak sizde sistemlerinizi Cacheleye bilir. Sunucunuzun rahatlamasini %50 ye varan performans artisini saglayabilirsiniz..

Bu cache uygulamasinin, hem size, hem hostinginize, hemde varsa sunucunuza yarari cok olacaktir. Bunun yaninda sitenizin arama motorlarinca daha cok indexlenmesine, hizli acildigi icin arama motorlarinin daha cok sitenizi ziyaret etmesine, hizli acildigi icin ziyaretcinin sitenize bir daha gelmesine ve daha bir cok konuya arti olarak etkisi vardir. Bu sebeple uyglarken, yada gelistirirken bildiklerinizi ogrendiklerinizi diger webmaster arkadaslarla paylasmayi unutmayin. Birbirimizin kuyusunu kasmak yerine bilgiyi paylastikca buyumeyi ogrenmenin vakti geldi sanirim..

Konuyu kapatmadan yukaridaki kodlar ile cache kullandigim sistemlere goz atarak sonucu gorebilirsiniz:

hdvideoclip.com: Ana sayfa ve video izleme kismi

makaleci.org: Ana sayfa ve haber okuma kismi

Farkli konularda yine yazacagim, simdilik esenlikle kalin..

PAYLAS
Önceki İçerikHz. Muhammed’in Hayatı ve Ölümü
Sonraki İçerikKüçük Orta Asya Türk Boyları
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) :)

15 YORUMLAR

  1. Load sorununun sebebi genelde eklentiler ve fazla kategorinin ana sayfada listelenmesidir. birini gormustum 70 tane eklenti kurulmustu sitesine. birde sildikten sonrada arkasinda bir seyler birakiyorlar, o bile sistemi kasiyor. Bu sebeple temiz bir wordpress ve yukarida anlattigim cache yi yaparak ciddi oranda load degerini %85 dusurebilirsiniz (cache uygulanan site icin).

  2. bi tane sayfam var, burdan post ettiğim değerlere göre diğer sayfada combobox’a değerler gelecek. ama 4-5 tabloyu joinleyip bu combobox a gelen datayı oluşturuyorum. bu da sayfayı çok yavaşlatıyor. bunun için de bu cache yapısını kullanabilir miyiz? saçma mı olur? ya da nasıl bişey önerirsiniz?

    • combobox konusunu anlamadim acikcasi :) ama eger sorgu sayisi yuksek ve sorgulariniz agir yuk olusturuyorsa mysql uzerinde o zaman file cache yerine sql cacheyi denemenizi oenririm :) bu konudada bir yazi yazdigimi hatirliyorum, aratirsaniz bulursunuz. Ama orneginizi anlamadim, saglikli bir onerimi emin degilim.

  3. merhaba, hocam, bir sorum olcaktı. wordpresste, özel kategorim var. adı böyle kategori şablonunun == category-44.php

    $cache_dosyasi= “category-44.php”;
    $cachefile = “cache/”.$cache_dosyasi.”.html”;
    $cachetime = 60 * 60; // 60 * 60 = 1 saat
    if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) {
    include($cachefile);
    echo “n”;
    exit;
    }
    ob_start();

    ?>

    böyle yaptım ama olmadı.

    cachefile satırında hata veriyor. birde cache klasörünü tema klasörüne koyuyoruz demi?

  4. hocam orayı değişkenmiş pardon :) bu seferde

    Parse error: syntax error, unexpected T_STRING in C:Program FilesEasyPHP-5.3.9wwwwp215wp-contentthemesSabah.Com.Tr Clone v1.0category-44.php on line 826

    şöyle bi hata verdi.. if (file_exists($cachefile) && (time() – $cachetime < filemtime($cachefile))) { include($cachefile); burası, ayrıca localhostta olduğum için chmod ayarını yapamıyorum ondan mı? sorun acaba..

Bir Cevap Yazın