Bursa Bilgisayar

Siteleriniz İçin Cache Sistemi Yapımı Anlatımı

Merhaba arkadaşlar ilk zamanlar açtığınız sitelerinizde yüklü bir trafik oluşmadığı için sunucu üzerindeki durumunuzda büyük bir sorun oluşmayacaktır ama işler büyüdükçe sıralamanız değişip siteniz geliştikçe artık kiraladığınız hostingler vpsler vdsler yada sunucular size yetmez hale gelecektir bu durumda optimizasyonu düşünecek ve araştırmaya başlıyacaksınız demektir.

Elbetteki sunucular üzerindeki optimizasyon kadar siteleriniz üzerindeki optimizasyonlarında çok önemli olduğunu anlayacaksınız budurumda kodları kendisi yazmış olan sitelerini kendileri tasarlamış olan arkadaşlar sorun yaşamayacaklardır.Hazır sistem kullanan arkadaşlar bu konuda gerçekten büyük problemler yaşamaktadırlar özellikle açık kaynak ile geliştrilmiş siteler ve eklentilerin baskısı gelişen trafikle inanılmaz bir hale gelebilmektedir.

Bazı hazır sistemlerin üzerine eklenti olarak yazılmış önbellek eklentileri bulunmaktadır.Her site için bu mümkün olmayabiliyor. Bu makalemde sizelere php ile yazılmış sitelerinizde kullanabileceğiniz performansınızı % 80 lere kadar artıran bir ön bellek sistemini anlatacağım sizde bu sistemi kendi sitelerinizde uygulayarak sitelerinizin açılış hızını dolayısı ile sunucularınızın ve sitelerinizin performansını artırabilirsiniz.

Önbellek Sistemleri

1 – Sabit ve değişmeyen sayfaları cacheleme

2 – Dinamik sürekli değisen aynı kalmayan sayfaları cacheleme

3 – Temalarınız üzerinde sabit ön bellekleme

4 – Cache içerisine dahil olmayacak kısımları ayırarak cachelemek.

1. Konudaki cache ile 1-2 sayfanizin cachesini almak istediğinizde kullanabileceğiniz bir sistem olarak karşınıza çıkacak. Çok fazla değişen siteniz yoksa, belli sayfalarda çok fazla sorgu varsa veya fonksiyon, bunlarin sunucuya yük oranını en aza indirgemek icin kullanilabilir.

Bu 1. konudaki basit cache olayına ornek vermek gerekirse bu siteye bakabilirsiniz:

http://www.oyun.gs

Sadece oyun açılış sayfalarında kullandığımız cache kodlari ile hem acilisin hizini hemde kullandigim bir kac php ve sql sorgusunun siteye yuk getirmesi, yavas acilmasi gibi bizi zor duruma dusurecek sorunlardan kurtarmaktadir.

Basit Cachenin Mantığı Nedir:

Kullanacağımız cache sisteminin nasıl islediğini anlatarak başlamakta yarar var. Kısaca sayfanın üzerine ve altina yerlestirdigimiz bir kac php kodu sayesinde orta kisimda oluşan sorgular, fonksiyolar gibi olayları tek bir dosyada toplayarak, 2. kez cağrıldığında bu dosyadan yardım alması diyebiliriz.

Özetle mantığın basit işleyişi:

Ziyaretci siteye girer —-> site sayfayı açmadan önce cache varmı yokmu kontrol eder —-> cache yoksa oluşan sorgunun cache’sini alir, varsa daha önce kayıt edilmiş cache sayfasını yükler.

Yararları :

İkincikez cağrılan sayfa cachelendiği icin php ve sql sorgularını çalıştırmadan direk cacheye alınan sabit html kodlarını cağıracak ve sayfaya işleyerek bize gösterecektir.

Bu sayfa açılış hızını %80 sunucuyu yorma yada kilitleme gibi ihtimalleride %60 azaltır..

Tek sayfalık basit cache’e örnek:

Birinci maddede anlattığım usule dayanarak sadece ana sayfanızı cache ile oluşturacaksınız.

$cachedosyasi = “cache/index.html”;
if (file_exists($cachedosyasi)) {
include($cachedosyasi);
exit;
}
ob_start();

$ch = fopen($cachedosyasi, ‘w’);
fwrite($ch, ob_get_contents());
fclose($ch);
ob_end_flush();

yukaridaki kod genel olarak bir cache’e alma sisteminin ana mantığını oluşturmaktadır.

Sırasıyla:

cache dosyasını tanımlıyoruz
cache dosyasını kontrol ediyoruz
varsa cacheyi cağırıyoruz ve işlemi sonlandırıyoruz
cache yoksa kodlar arasındakileri html olarak cacheliyoruz
sonrasında işlem en başa donecektir..

Eger bu cachede zaman sınırı eklemek istiyorsaniz, yani belli aralıklarla dosya belirlediginiz süreden eski ise yenilenmesini sağlamak isterseniz küçük bir zaman kontrol kodu ile işlemi başarılı bir şekilde sağlamış olursunuz.

$cachedosyasi = “cache/index.html”;
if (file_exists($cachedosyasi) && (time() – 2700 < filemtime($cachedosyasi))) { include($cachedosyasi); exit; } ob_start();
$ch = fopen($cachedosyasi, ‘w’);
fwrite($ch, ob_get_contents());
fclose($ch);
ob_end_flush();

Yukarıdaki kısımda bulunan 2700 ibaresi saniye cinsinden hesaplamak içindir. Eğer cache alınan dosya 2700 saniyeden eski ise yenisini oluşturmaktadır.

cachelenecek alanıda

ob_start();

kodu ile açıp

ob_end_flush();

kodlarıyla bitiriyoruz, ve arada kalan sorgular, fonksiyonlar saf htmlye cevrilerek cache içerisine alınmış olur.

Değişen sayfalar için cache mantığı:

Sabit kalmayan ve devamlı olarak get, post methoduyla değişen sayfalarınız olabilir. Yada bu metodların dışında tek bir dosyadan birden fazla içeriğe hükmediyorsanız basit cache sistemi etkisiz kalacaktir. Çünkü aynı dosya üzerinden cachelenen dosya 1 tane olacağından ve aynı isimde kalacağından, başka konuda sayfa cağırdığında önceki cache alınan sayfayı göstereceğinden işinize yaramayacaktır. Ancak cachelenen dosya ismini adres satırındaki urlye yada sayfanıza gelen get,post metodundaki bir veriye göre yaptırabilirsiniz. Boylece her sayfa değiştiğinde o sayfaya ait cache alınır. Örnek vermek gerekirse video siteniz var ve bu video sitesinde tek dosyadan işlem yaptırarak milyonlarca video gosteriyorsunuz ziyaretcilerinize.
soyle ornek bir kac link gostereyim ben size:

http://www.tranceclip.com

Bu sistemi sunucuyu linç edecek duzeyde fonksiyon ve sql sorgusu barındıran sistemlerde kullanmanızı öneririm. Dilerseniz böyle bir sistemde kullanılacak cache kodlarını paylaşarak açıklamaya geçelim.

$cachedosyasi = “cache/”.md5($_SERVER[‘REQUEST_URI’]).”.html”;
if (file_exists($cachedosyasi) && (time() – 2700 < filemtime($cachedosyasi))) { include($cachedosyasi); exit; } ob_start();

$ch = fopen($cachedosyasi, ‘w’);
fwrite($ch, ob_get_contents());
fclose($ch);
ob_end_flush();

Yukarıdaki örnekte benim kullandığım mantıkla aynı urlden aldığım bilgiyi md5 ile şifreleyip cache ediyorum. Boylece saçma karakterler varsa cache ederken sorun çıkartmasını engelliyoruz.

Eger adres satırındaki urlye gore değilde gelen get yada post daki bilgilere göre cache yapmak isterseniz yukarıdaki koddaki: $_SERVER[‘REQUEST_URI’] kısmını bunlardan biriyle değişmeniz yeterli:
$_GET[‘GETMETODU’] yada $_POST[‘POSTMETODU’]

Böylece cache yaparken aynı adres urlsiyle yada aynı get veya post bilgisiyle karşılaştığında cache ettiği onceki dosyayı cağıracaktır. Böylece herzaman aynı dosyayı ziyaretçiye göstermeyecektir..

Belirttiğimiz zaman sınırınıda dilediğiniz sekilde düşürebilir yada uzatabilirsiniz. Ben saniye cinsinden yazdım. Varin siz hesaplayin gerisini 🙂

Bu arada kodları kullanırken dosya yolunu gosterirken kullandığım cache/… dizininin yolunu oluşturmazsanız hatada verebilir. olusturduktan sonra cache klasorümüze chmod 777 izni verirseniz sorunsuz şekilde cache oluşturup, silip yeniden kaydedebilir..

3- Bu bölümde vereceğim örnekle örneğin .tpl tema dosyalarının içine yerleştireceğiniz alt bölümdeki kodlarla temalarınızın en çok sorgu oluşturan bölümlerini kayıt edebilirsiniz.



Bu örneğimde sizlere anlattığım cacheleme sistemi kayıt edeceği sayfaların isimlerini md5 ile şifreleyerek kayıt etmektedir url’den olduğu gibi gelen sayfa ismini kayıt etmek isterseniz üstteki kodda alttaki bölümü değiştirerek gelen sayfayının ismini olduğu gibi kayıt edebilirsiniz.

$filename = “”.$_SERVER[‘REQUEST_URI’].”.html”;

Belleğe almak istediğiniz sayfaları kendi uzantıları ile kayıt etmek isterseniz alt bölümde yazdığım kodu yukarıdaki kodla değişitirirseniz olduğu gibi kendi sayfalarınızda oluşan uzantı olarak kayıt edilecektir.

$filename = “”.$_SERVER[‘REQUEST_URI’].””;

Kodlarınızın bir bölümünü cache içerisine almak bazı bölümlerini yok saymak istiyorsanız örneğin istatistik ve sürekli dinamik olarak değişen bölümlerini yok saymak istiyorsanız.

ob_start(); ‘a kadar olan kısmı cachelenmesini istediğiniz yerden hemen önce yazıcaksınız.

cachelenmesini istediğiniz yerden hemen sonra da $fp = fopen($cachefile, ‘w+’); satırından itibaren olan kısmı yazıcaksınız.

4 – Bu örnek sizi açmadıysa alt bölümdeki örneğimizde görğünüz gibi aynı cache dizini içerisine sayfa isimleri karışmadan 2.3.belkide 100.kez sitenizin farklı bölümlerini cacheleyebilirsiniz.


cache olmayan içerik…………….
…………………………………..

//1. cache alanı başlıyor
$filename1 = “%%BIRINCI-CACHE-“.md5($_SERVER[‘REQUEST_URI’]).”-%%.html”;
$cachefile = “cache/”.$filename1;
$cachetime = 3 * 60 * 60; // Cache Süresi
if (file_exists($cachefile))
{
if(time() – $cachetime < filemtime($cachefile)) { readfile($cachefile); exit; } else { unlink($cachefile); } } ob_start(); ?>
Cache girecek birinci bölüm…

cache dışındaki içerik……………
…………………………………………..

2. CACHELENEN ALAN
(birinci alandan farklı bir html dosyasında tutulur)
…………………………………
…………………………………

cachesiz olarak devam eden içerik……….

Yukarıdaki örnekte sizi açmadıysa veya fazla yer kaplayacağını düşünüyorsanız istatistik sayfalarınızı yada sürekli değişecek olan kısımlarınızı ayrı bir php sayfasına alarak include ile sayfa içerisine dahil ederek böylece kodlarınızın değişecek olan kodlarınızın cache sistemine dahil olmamasını sağlayabilirsiniz.

Örneğimiz

İstatistik yada ayrı tutacağımız kodlarımızı

istas.php dosyası içerisine alıyoruz ve sayfamız içerisine çağırıyoruz.Kalan kodlarımızı olduğu gibi cache sistemine dahil ediyoruz böylece sayfa çağırıldığı zaman istatistik yada dinamik değişecek olan içeriğimiz cache’den ayrı olarak kayıt ediliyor.

Kullanımı ;

include “istas.php”;


Başka yöntemler isterseniz sizlere önereceğim en güzel örnekler olarak serialize ve unserialize konularını araştırmanızı öneriyorum.

www.hostingtc.com’a katkılarından dolayı teşekkür ederiz.

Bursa-bilgisayar.com’dan sayglar sevgiler dilerim sizlere bir nebzede olsa yardımcı olabilmişimdir.

Related posts

3.584 thoughts on “Siteleriniz İçin Cache Sistemi Yapımı Anlatımı

  1. Thank you for any other fantastic article. The place else could anybody get that kind
    of info in such an ideal means of writing? I’ve a presentation subsequent week, and I’m
    at the search for such info.

  2. We’re a group of volunteers and opening a new
    scheme in oour community. Your site offered us
    with valuable info to work on. You’ve done aan impressive job and our enntire community will be
    thankful to you.

  3. Thanks tto my father who stated to me about his blog, this website is truly
    amazing.

  4. Very good blog! Do you have any hints forr aspiring writers?
    I’m planning to start my own webssite soon but I’m a little lost on everything.

    Would you suggest starting with a free platform like WordPress or go for a
    paid option? There are so many options out there that I’m completely confused ..
    Any ideas?Kudos!

Bir Cevap Yazın

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

 Characters available