Zoque.Forum
Dirsek Teması:
Geri Dön Zoque.Forum » Webmaster Kaynaklari » Makaleler » SQL Caching - Nasıl Yapılır?


Makaleler Tasarım, teknoloji, web, kültür ve sanat ana başlıkları olmak üzere forumda yer verilen bölümler ilgili her türlü makaleye bu bölümde yer verebilirsiniz. Sitenizde yayınladığınız ve burada bizlerle yeniden paylaşmak isteyeceğiniz makaleleri de gönderebilirsiniz.

Comment
 
LinkBack Article Tools
Old 18.02.2004  
hayalet
 
hayalet's Avatar
 
Üyelik Tarihi: 07.10.2002
Yer: İstanbul
Yaş: 26
Mesaj: 986
SQL Caching - Nasıl Yapılır?

Hız Hız Hız..
İlk kullanılmaya başlandığından bu yana internet üzerinde çok fazla değişiklik oldu. Sadece metinden oluşan web sitelerinden, görselliğin ön plana çıktığı şaheserlere; statik HTML sayfalarından, karmaşık programlara geçiş hepimizin gözü önünde gerçekleşti. Önceden "sadece içerik önemlidir" diyenler şimdi görselliğinde ne kadar ön planda olduğunu inkar edemiyorlar. Fakat bu kadar yoğun içerik sunan web sitelerinde yeni bir problem ortaya çıktı: Hız. Halen çok fazla Dial-Up kullanıcısı olduğu düşünüldüğünde (ne yazıkki bende onlardan biriyim), kullanılan resimlerin biraz yük getirdiği açık. Hele sunucu taraflı programlama dilleriyle birlikte varlığından daha fazla haberdar olunan veritabanları da işin içine girince ortalık biraz daha karışıyor.

Kullanacağınız görselliğe bir diyeceğim yok, ama veritabanı probleminiz için belki bir çözüm önerebilirim.

Madem web siteleri hazırlıyorsunuz, o zaman biliyorsunuzdur; cache (önbellek diyenlerde var, cache demeyi tercih edeceğim) kavramı tarayıcılarla beraber bizlerinde günlük yaşamına adım attı. Hala "cache nedir?" diye soranlarınız mı var? Ufak bir açıklama yapalım o zaman.

İnternette dolaştığınızda, geztiğiniz sitelerde bulunan resimler, HTML sayfaları, sunucu taraflı dillerin HTML çıktıları, scriptler, CSS dosyaları, vs 'nin hepsi önce bilgisayarınıza yüklenir. Bu dosyaların hepsi tarayıcınıza özel klasörlerde bulunur. Neden mi? Bir daha aynı siteyi ziyaret ederseniz aynı sitenin daha hızlı yüklendiğini görürsünüz. Tarayıcı bu siteden yüklenmiş olan dosyaları tekrar yüklemek için zahmete girmez, daha önce yüklenmiş olan dosyaları kullanır. İşte bu şekilde bilgisayarınıza yüklenmiş olan dosyalar topluluğuna cache adı verilir. Cache'in bir işlevini de, tarayıcınızı "çevrim dışı" çalıştırdığınızda görebilirsiniz. Daha önce ziyaret ettiğiniz siteleri, internete bağlı olmadığınız halde, görebilirsiniz. Burada yine cache kullanılmaktadır.

Neden mi anlattım bu kadar şeyi? Önereceğim çözümde buna benzer olacakta ondan. Hemen bir örnekle açıklamaya çalışayım. Diyelimki bir alışveriş sitesi hazırlamaktasınız ve bu sitede ürünler birçok kategorinin altında listeleniyorlar. site sahiplerinin kolayca kategori ekleyip, var olanlarda değişiklik yapabilmesi içinde bütün kategorileri veritabanında tutmaya karar verdiniz (Belki çok iyi değil ama sık kullanılan bir çözüm). Sitenin her sayfasında bu kategorilere ihtiyacınız olacağına göre her sayfada veritabanına bağlanıp kategorileri tekrar tekrar sorgulayacak mısınız? Diyelimki böyle yaptınız, ama sorunu biraz daha komplike hale getirelim. Klasik DHTML drop down menü kullanmaya karar verdiniz, yani kategorileriniz alt kategorileri de var. Bu da sorgulamanın bir sorgudan oluşmayacağını, oluşsa bile bir çok dizi işlemiyle uğraşacağınızı gösterir. Kafanızı biraz daha kaşıyın ve işin içinden çıkmaya çalışın. Yada sizi zahmete sokmayayım, cache mantığını kullanalım

İlk Göz Ağrısı: Dosyalar

Daha fazla laf salatası yapmadan, bir örnek ile başlayıp ona devam edeceğim. Örneğimiz kullanıcı kaydı yapan bir formdan oluşuyor.

Kod:
<HTML>
   <head>
     <title>forum.zoque.net</title>
   </head>
   <body>
     <form>
       <label for="ad">Adınız</label> <input type="text" name="ad" id="ad"><br /> 
       <label for="soyad">Soyadınız</label> <input type="text" name="soyad" id="soyad"><br /> 
       <input type="submit" value="Üye Ol!"> 
     </form>
   </body>
</HTML>
Kullanıcıdan adını ve soyadını isteyen ufak bir form yaratmış olduk. Ertesi gün patronunuz yanınıza uğradı ve kullanıcının bulunduğu ili soran bir bölüm daha eklemenizi istedi.. Hemen eklediniz tabiki..

Kod:
<label for="il">Yaşadığınız İl</label> 
<select name="il" id="il"> 
    <option>--Lütfen Seçiniz--</option> 
    <option value="01">Adana</option> 
    <option value="02">Adıyaman</option> 
    <option value="03">Afyon</option> 
    ... 
</select>
81 ilimizi alt alta dizdiniz, tebrikler. Peki yazılan bu form yurtdışında kullanılırsa ne olacak? Yurtdışında yaşayanlara Türk illerini gösteremezsiniz. Yine radikal bir çözüm bulduk ve illeri veritabanına taşıdık, bravo yeniden.

İsteğimiz bu illeri her seferinde veritabanından sorgulayarak oluşan hız kaybını yok etmek (Biliyorum, çok kısa bir süreden bahsediyoruz bu örnekte. Fakat bu sorgunun yanına başka sorgularda gelince hız farkedecektir, bana inanın). Niyetimiz veritabanından çektiğimiz verileri bir dosyaya kaydetmek ve yeniden sorgulamak gerektiğinde bu dosyadaki içeriği kullanarak işleri hızlandırmak.. Yine sana işimiz düştü, dosya fonksiyonları.

Devam etmeden once aşağıda kullanacağım dosya fonksiyonlarının işlevlerini hatırlatmak istiyorum:

fopen: Dosya açmak için kullanılır.
fwrite: Dosya içeriği yazmak için kullanılır.
fread: Dosya içeriği okumak için kullanılır.
fclose: Açılmış bir dosyayı kapatmak için kullanılır.
file_exists: Bir dosyanın var olup olmadığını kontrol etmek için kullanılır.
filemtime: Dosyanın son değişiklik tarihini öğrenmek için kullanılır.
filesize: Dosyanın byte olarak büyüklüğünü verir.

Şimdi kodlara geçelim.

PHP Code:
<?PHP 
mysql_connect
('localhost''kullanıcı_adı''parola');
mysql_select_db('cache_test');

$SQL 'SELECT kod, sehir FROM sehirler ORDER BY sehir ASC';
$query mysql_query($SQL);
 

while( 
$sehirler mysql_fetch_object($query) )
   echo 
'<option value="' $sehirler->kod '">' $sehirler->sehir '</option>';
 
?>
Önce mysql_connect() ve mysql_select_db() yardımıyla veritabanına bağlantıyı sağlıyoruz. Daha sonra veritabanında istediğimiz sorguyu mysql_query() ile gerçekleştiriyor, mysql_fetch_object() ile de veritabanından dönen sonucu istediğimiz şekilde kullanıyoruz.

Sanırım bu bize istediğimizi veriyor. Şimdi bu kodla biraz oynayarak alınan sonucu cache dosyasına yazmaya çalışalım.

PHP Code:

<?PHP 
function checkCacheFile($file){
    return 
file_exists($file);
}
 
function 
getContents(){
   global 
$cacheFile;
   if( 
checkCacheFile($cacheFile) ){
     
$fd fopen($cacheFile'r'); 
     
$contents fread($fdfilesize($cacheFile) );
     
fclose($fd);
     return 
unserialize($contents);
  }
 else{
    
mysql_connect('localhost''kullanıcı_adı''parola');
    
mysql_select_db('cache_test');
 
    
$SQL 'SELECT kod, sehir FROM sehirler ORDER BY sehir ASC';
    
$query mysql_query($SQL);
 
    
$tmp = array();
 
    while( 
$sehirler mysql_fetch_object($query) )
      
$tmp$sehirler->kod ] = $sehirler->sehir;
 
      
$fd fopen($cacheFile'w');
      
fwrite($fdserialize($tmp) );
      
fclose($fd);
      return 
$tmp;
    }
}
 
$cacheFile 'cacheExample.txt';
$sehirler getContents();
 
foreach(
$sehirler as $kod => $sehir)
    echo 
'<option value="' $kod '">' $sehir '</option>';
 
?>
Kodlar biraz daha uzamış gibi görünüyor. Ama gözünüz korkmasın, aslında kolay bir mantık takip ediyor.

Kod sırası takip edilirse, işlemin getContents() fonksiyonunun çağırılması ile başladığını söyleyebiliriz. Bu fonksiyon çağırıldığında öncelikle bir cache dosyasının var olup olmadığı checkCacheFile() fonksiyonu yardımıyla kontrol ediliyor. Eğer bir cache dosyası bulunamazsa veritabanına bağlanılıp aynı sorgular gerçekleştiriliyor. Fakat bu sefer uygulanan adımda bir farklılık var. Gelen sonuc direk çıktı olarak kullanılmıyor, onun yerine $tmp adında bir diziye aktarılıyor. Tüm sonuçlar bu diziye aktarıldıktan sonra fopen() yardıyımla cache dosyası yazma modunda (w) açılıyor ve elde ettiğimiz dizi serialize edilerek dosyaya yazdırılıyor.

Bir daha aynı sorgu gerçekleştirildiğinde, artık bir cache dosyası bulunacağından dolayı, önce cache dosyası okuma modunda açılır (r) ve içeriğin tamamı okunur. Daha sonra elde edilen içerik unserialize edilerek geri döndürülür.

programı çalıştırdığınızda cache dosyanızda buna benzer bir görüntü olduğunu görmelisiniz:

Alıntı:
a:81:{s:2:"01";s:5:"Adana";s:2:"02";s:8:"Adıyaman" ;s:2:"03";s:5:"Afyon";i:68;s:7:"Aksaray";...
Tamam mı, Devam mı?

Buraya kadar hayatımızı kurtardık, ama farketmeden büyük bir hata yaptık!

Diyelimki devlet büyüklerimiz bir ilçemizi daha il yaptı, 82 ilimiz oldu. Problem yok, hemen veritabanına ekledik. Ama biz bir cache dosyası oluşturmuştuk ve o dosya varken veritabanına ulaşmaya gerek yok demiştik! Ne yapacağız?

Hemen kafanızın yanında bir ampül yandığını görüyorum, dosyayı sileriz! Evet çözüm bu kadar basit. Her seferinde dosyayı silmeye başladık diyelim ama ya unutursak ne olacak? En iyisi biraz otomatik çalışalım ve bırakalım yazdığımız program bizim yerimize düşünsün.

Çözümümüzü iki adımdan oluşturalım. İlk olarak (burada gösterilmeyecek), veritabanına yeni bir il eklediğimiz dosyada ufak bir değişiklik yapalım ve unlink() fonksiyonu ile yeni il eklendiğinde, oluşan cache dosyasını silelim. İkinci adımda ise, otomatik olarak oluşan cache dosyasını belirli periyotlarda silelim ve dosyaya veritabanından taze bilgiler gelmesini sağlayalım. Örneğimizde kodlarımızı, dosyayı haftada bir yenileyecek şekilde değiştirelim.

Elimizde örnek üzerinde, bulduğumuz çözümü uygulamak da kolay olacak. Değişiklik sadece checkCacheFile() fonksiyonunda olacak.

PHP Code:
<?PHP 
$maxTime 
604800// saniye = 1 hafta
 
function checkCacheFile($file){
   global 
$maxTime;
   return ( 
file_exists($file) && ( filemtime($file) > ( time() - $maxTime ) ) );
}
 
?>
Yaptığımız işlem şu: Dosyanın var olup olmadığı kontrol edildiğinde file_exists() fonksiyonundan dönen değerin yanında, cache dosyasının en son değişiklik tarihini de kontrol edeceğiz. Bu dosyaya yapılan en son değişiklik tarihi, dosyanın yaratıldığı tarihtir. Bu nedenle 1 haftadan daha önce oluşturulmuş dosyaları yokmuş farzedip, yenisini oluşturmaya çalışacağız. Dosya bulunmadığı zaman yeni dosyayı yazma modunda açtığımızdan (w), eski dosya silinerek yerine yenisi oluşturulacaktır.

En basit haliyle yaratılacak cache dosyası bu kadarlık bir el emeğinden oluşuyor. Bir sonraki adımda işin içine biraz daha profesyonel bilgi katmaya çalışacağız.

O Obje Senin, Bu Obje Benim

Buraya kadar öğrendiğimiz basit bilgiyi, biraz derleyip toparlayalım ve şık bir görüntü verelim. Yazdıklarımızı bir sınıf halinde toparlayalım.

Buradan itibaren yazacağım sınıf, başka bir sınıfın yardımıyla oluşturulacaktır. Bu sınıfı forum.zoque.net adresinde de bulabilirsiniz. Yardımcı sınıf aşağıda verilmektedir. (Tabiki yazacağımız yeni sınıfı, bu sınıf olmadan da yazabiliriz. Hem araya veritabanı kodları ekleyerek asıl konudan uzaklaşmamak, hemde iki sınıfın birlikte nasıl kullanılabileceğini göstermek adına böyle bir yol seçtim)

PHP Code:
<?PHP 
class DB{
   var 
$host 'localhost';
   var 
$database 'cache_test';
   var 
$user 'kullanıcı_adı';
   var 
$pass 'parola';
 
   var 
$link;
   var 
$db_link;
   var 
$query;
   var 
$record = array();
   var 
$errno 0;
   var 
$error '';
   var 
$show_error 0;
   var 
$stop 0;
  
   function 
connect(){
     if(!
$this->link){
       
$this->link = @mysql_connect($this->host,$this->user,$this->pass);
       if(!
$this->link)
          
$this->print_error();

       
$this->db_link= @mysql_select_db($this->database,$this->link);
       if(!
$this->db_link)
          
$this->print_error();
     }
  }
 
  function 
print_error(){
     
$this->error = @mysql_error();
     
$this->errno = @mysql_errno();
     if( 
$this->stop ){
          echo 
'</td></tr></table>';
          if(
$this->show_error)
             echo 
$this->errno.' : '.$this->error;
          exit;
      }
   }
 
   function 
query($SQL){
      
$this->connect();
      
$this->query = @mysql_query($SQL);
      if(!
$this->query)
         
$this->print_error();
      return 
$this->query;
   }
 
   function 
next($query=-1) {
       if (
$query!=-1)
           
$this->query=$query;
       
$this->record = @mysql_fetch_array($this->query);
       return 
$this->record;
  }
 
  function 
get_error(){
      return 
$this->error;
  }
 
  function 
get_errno(){
     return 
$this->errno;
  }
 
  function 
num($query=-1){
      if (
$query!=-1)
         
$this->query=$query;
      return @
mysql_num_rows($this->query);
  }
 

  function 
get($name){
      return 
$this->record[$name];
  }
 
  function 
close(){
     @
mysql_close($this->link);
  }
 
}
 
?>
Bu sınıf dosyası veritabanına bağlantı işlemini ve sorgulamaya kolaylaştıracak bir veritabanı bağlantı sınıfıdır. Dikkat edilirse özellikle connect() metodu çağırılmadıkça veya direk olarak query() metodu çağırılıp sorgulama yapılmadıkça veritabanı bağlantısı açılmamaktadır. Buda istenmeyen bir yavaşlama olmaması anlamına gelir.

DB sınıfı yardımıyla Cache sınıfı iki şekilde oluşturulabilir. Birincisi DB sınıfından türetme yapılabilir. İkinci olarak bir DB sınıfı nesnesi Cache sınıfına parametre olarak verilebilir. Yapacağımız örnekte ikinci yolu kullanacağım.

Sınıfı adım adım oluşturalım.

PHP Code:
class Cache
    var 
$db null;
    var 
$filename 'cacheExample.PHP';
 
    function 
Cache($db null){
        if( 
$db != null && is_subclass_of($db'DB') )
            
$this->db $db;
    }

Şu anda Cache sınıfı iki sınıf değişkeni ve Constructordan oluşuyor. Birinci sınıf değişkeni 'DB' sınıfının nesnesini tutacak olan değişken, ikincisi ise cache dosyası olarak kullanacağımız dosyayı belirten değişkendir. Dikkat ederseniz bu sefer cache dosyası PHP dosyası olarak belirtilmiş. Cache dosyasını bu sefer düz text dosyası olarak tutmayıp, PHP dosyası oluşturacağız. Constructor ise, zorunlu olmayan bir parametre alıyor. Eğer bu parametre DB sınıfının bir nesnesi olursa, daha sonraki işlemlerde kullanabilmek için $db sınıf değişkenine atanıyor.

Cache nesnesi yardımıyla veri okumayı read() metodu yardımıyla yapacağız.

PHP Code:
var $MAX_TIME 604800// 1 hafta 

function read(){ 
   if( 
$this->exists() ){
      include 
$this->filename;
      return 
$__cacheVar;
   }


function 
exists(){ 
     if( 
file_exists($this->filename) && filemtime($this->filename) > ( time() - $this->MAX_TIME ) )
         return 
TRUE;
     return 
FALSE;

read() metodunu eklemeden önce, bir sınıf değişkeni daha ekliyoruz: $MAX_TIME. Bu değişken saniye cinsinden cache dosyalarının ömrünü belirleyecek. Daha önceki örnekte kullanılan $maxTime değişkeni gibi.

read() metodu basit olarak öncelikle cache dosyasının varolup olmadığını kontrol ediyor. Varsa bu dosyayı ekliyor ve bu dosya içinde bulunan bir değişkeni geri döndürüyor (Unutmayın, cache dosyalarını PHP dosyası olarak oluşturuyoruz!). Dosyanın varolup olmadığının kontrolünü yapan exists() metodu, daha önce yazdığımız fonksiyonun tam olarak aynısı.

Şu anda read() fonksiyonu, istediğimiz dosya varsa işlemi güzel olarak yapıyor, peki ama ya yoksa? O zaman dosyanın bulunmadığı durumda ne yapması gerektiğini de belirtelim.

PHP Code:
function read(){ 
    if( 
$this->exists() ){
       include 
$this->filename;
       return 
$__cacheVar;
    }
  
    
$var $this->readFromSQL();
    
$this->createCacheFile($var);
 
    return 
$var;

Cache dosyası bulunamadığında, veritabanından gerekli bilgiler okunarak ( readFromSQL() ) bir cache dosyası oluşturulacak ( createCacheFile() ) ve son olarak veritabanından okunacak bilgiler geri döndürülecek ( return $var ). Mantık aynı mantık değil mi?

Oku Oku Bitmedi!

Sırada veritabanından bilgileri okumak var. Burada yukarıda belirtilen DB sınıfı kullanılacak.

PHP Code:
function readFromSQL(){ 
    
$SQL 'SELECT kod, sehir FROM sehirler ORDER BY sehir ASC';
 
    if( 
$this->db == null )
        
$this->db = new DB;
 
    
$db $this->db;
    
$db->query$SQL );
    
$var = array();
 
    while( 
$db->var->next() )
        
$var$db->get('kod') ] = $db->get('sehir');
 
    return 
$var;

readFromSQL() kısaca ve sırayla veritabanında istediğimiz sorguyu gerçekleştirerek, sonucu bir diziye aktarıyor ve geri döndürüyor. Burada asıl olarak anlatmak istediğim bölüm farklı. Dikkat ederseniz bir bölümde $db sınıf değişkeninin null değerine sahip olup olmadığı kontrol ediliyor. Hatırlarsanız Constructorda $db değişkeninin ataması isteğe bağlıydı. Eğer sınıf nesnesi oluşturulurken bir DB nesnesi parametre olarak verilmezse, $db değişkeninin değeri varsayılan değer olarak kalır (null). Bu durumda yeni bir DB nesnesi oluşturmak bize düşüyor.

Son olarak cache dosyamızı oluşturalım.

PHP Code:
function createCacheFile($var){ 
    
$fileString ' ?PHP'."\n\n";
    
$fileString .= "\t" '$__cacheVar = array();'."\n";
 
    foreach(
$var as $key => $value)
       
$fileString .= "\t".'$__cacheVar[\''.$key.'\'] = \'' addslashes($value) . '\'; ' "\n";
 
    
$fileString .= '?>';
 
    
$fp fopen($this->filename'w');
    
fwrite($fp$fileString);
    
fclose($fp);

Öncelikle dosyaya yazacağımız ifadeyi oluşturuyoruz. Bu basit bir string değişken olacak. Bir PHP dosyası oluşturduğumuza göre <?PHP ile başlayıp ?> ile bitirmeliyiz. O halde string değişkene öncelikle <?PHP eklenecek ve en son ise ?> eklenecektir. Arada ise, read() metodunda kullandığımız $__cacheVar değişkenini oluşturacağız. Öncelike $__cacheVar değişkeni bir dizi olarak tanımlanıyor ve bir foreach() döngüsü yardımıyla elimizde $var değişkeninde bulunan değerler bu diziye aktarılıyor. Dosyamızın oluşturulması ise bu kadarlık bir çabadan oluşuyor.

Not: Dosya UNIX dosya sitemiyle olu?turuluyor. Oluşan dosyayı notepad ile açarsanız, satırların birbirine karışmış olduğunu görebilirsiniz. Merak etmeyin hatalı çalışmaz. Notepad ile de doğru olarak görüntülenmesini isterseniz \n yerine \r\n yazabilirsiniz.

Sınıfa birde dosyayı silen ufak bir method eklersek:

PHP Code:
function erase(){ 
    @
unlink($this->filename);

Sınıfımız tamamlanmış olacaktır. Oluşturulmuş sınıfın tamamı ve biraz daha gelişmiş hali aşağıda gösteriliyor. Gelişmişten kasıt, birden fazla sorgunun cache dosyasının oluşturulmasıdır. Aşağıdaki sınıf yardımıyla cache dosyaları tablo adına göre oluşturuluyor. ( Örneğin sehir tablosunun cache dosyası olusturuluyorsa, sehir.cache.PHP adında bir dosya oluşturuluyor. )

PHP Code:
<?PHP 
class Cache{
    var 
$db null;
    var 
$filename;
    var 
$table;
    
    var 
$MAX_TIME 604800// bir hafta
 
    
function Cache($file$db null){
        if( 
$db != null && is_subclass_of($db'DB'))
            
$this->db $db;
        
$this->setFile$file ); // $file, tablo adı olarak veriliyor. ör: sehir
    
}
 
    function 
setFile($file){
       
$this->table $file
       
$this->filename './' $file '.cache.PHP';
    }
 
    function 
read(){
       if( 
$this->exists() ){
          include 
$this->filename;
          return 
$__cacheVar;
       }
 
       
$var $this->readFromSQL();
       
$this->createCacheFile$var );
       return 
$var;
    }
 
    function 
readFromSQL(){
       
$SQL $this->createSQL();
       if( 
$SQL == '' )
          return;
  
       if( 
$this->db == null )
            
$this->db = new DB;
       
$db $this->db;
       
$db->query$SQL );
 
       
$var = array();
       while( 
$db->next() )
           
$var$db->get(0) ] = $db->get(1);
       return 
$var;
    }
 
    function 
createCacheFile($var){
         
$fileString '<?PHP"\n";
         
$fileString .= '/**' "\n";
         
$fileString .= ' * This cache file is created by cache.class ' "\n";
         
$fileString .= ' * Programmer: Yusuf Uğur Soysal ' "\n";
         
$fileString .= ' * Created: ' date('d.m.Y H:i:s') . "\n";
         
$fileString .= ' * Timestamp: ' time() . "\n";
         
$fileString .= ' */ ' "\n\n";
 
         
$fileString .= "\t" '$__cacheVar = array();' "\n";
 
         foreach( 
$var as $key => $value )
             
$fileString .= "\t" '$__cacheVar[\''.$key.'\'] = \'' addslashes$value ) . '\'; ' "\n";
 
         
$fileString .= '?>';
 
         
$fp fopen($this->filename'w');
         
fwrite($fp$fileString);
         
fclose($fp);
    }
 

    function 
createSQL(){
          
$SQL '';
 
          switch( 
$this->table ){
                case 
'kategori':
                     
$SQL 'SELECT id, kategori FROM kategori WHERE ust="0" ORDER BY kategori ASC';
                     break;
                case 
'sehir':
                     
$SQL 'SELECT kod, sehir FROM sehir ORDER BY sehir ASC';
                     break;
                case 
'ulke':
                     
$SQL 'SELECT kod, ulke FROM ulke ORDER BY ulke ASC';
                     break;
                case 
'universiteler':
                     
$SQL 'SELECT id, uni FROM universiteler ORDER BY uni ASC';
                     break;
                case 
'meslekler':
                     
$SQL 'SELECT id, dept FROM meslekler ORDER BY dept ASC';
                     break;
          }
 
          return 
$SQL;
    }
 
    function 
exists(){
          if( 
file_exists($this->filename) && filemtime($this->filename) > ( time() - $this->MAX_TIME ) )
              return 
TRUE;
          return 
FALSE;
    }
 
    function 
erase(){
        @
unlink$this->filename );
    }
 
}
 
?>
Kullanım Örneği:

PHP Code:
$cache = new Cache('sehir');
$sehirler $cache->read();
print_r($sehirler); 
Bu dökümandaki kodlar sadece örnek amaçlıdır. Tüm örnekler Win2K PHP 4.3.3 Apache 2.0 ile test edilmiştir.

Yusuf Uğur Soysal - hayalet.
hayalet şu an çevrimdışı   Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 18.02.2004  
Scud
 
Scud's Avatar
 
Üyelik Tarihi: 25.08.2001
Yer: Antalya
Yaş: 26
Mesaj: 970
Re: SQL Caching - Nasıl Yapılır?

Bir şey sorucam. eleştirmek için değil bilgi edinmek için soruyorum. benim bildiğim cache işlemi başka bir yere bağlanılarak alınması gereken fakat sık güncellenmeyen bilgilerin dosya sisteminde tutulmasıdır.. Bu çerçvede serverda MySQL sorgusu yaptımak ile aynı serverda dosya okutturmak arasında bir hız farkı göremiyorum. Hatta MySQL'in azcık daha hızlı çalışacağını söylemeliyim. Çünkü örnekte chache dediğin olay MySQL serverin olduğu bilgisayarda tutuluyor.. Bunu açıklayabilir misin?
__________________
Take me back to my boat on the river
and I won't cry out any more
Scud şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 19.02.2004  
hayalet
 
hayalet's Avatar
 
Üyelik Tarihi: 07.10.2002
Yer: İstanbul
Yaş: 26
Mesaj: 986
Re: SQL Caching - Nasıl Yapılır?

dediğin şey benimde aklıma gelmedi değil. bir örnekle söyleyeyim.

bu işlemleri ilk araştırmaya başladığımda yaptığım bir site vardı. bu sitenin yaklaşık 20-30 formu bulunuyordu. ve formların yarısında da aynı bilgiler alınıyordu: şehir - ülke - meslek - kategori vs..

bilgileri her seferinde veritabanından almak baya kastırıyordu ama caching kullanmaya başladıktan sonra her sayfanın en az 1-2 snye hızla açıldığını gördüm. benchmarklar durmuyo sanırım ama bulursam göndereceğim.

ayrıca dosya işlemleri veritabanı işlemlerinden daha kısa sürmeli
hayalet şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 19.02.2004  
soul
 
soul's Avatar
 
Üyelik Tarihi: 13.07.2000
Yer: LND
Mesaj: 4,251
Re: SQL Caching - Nasıl Yapılır?

Dosya işlemleri her zaman dblere göre daha hızlı oluyor.
__________________
FERRUH.MAVİTUNA - Okuduklarim
3-5-7 zotoro ucgeni
soul şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 19.02.2004  
Scud
 
Scud's Avatar
 
Üyelik Tarihi: 25.08.2001
Yer: Antalya
Yaş: 26
Mesaj: 970
Re: SQL Caching - Nasıl Yapılır?

<