+ Yanıtla
Sayfa Düzeni: 1 / 3
1 2 3 SonSon
Toplam 23 sonuçtan 1 ile 10 arası olanlar

Konu Başlığı: SQL Caching - Nasıl Yapılır?

  1. #1

    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 Kodu:
    <?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 Kodu:

    <?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:

    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 Kodu:
    <?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 Kodu:
    <?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 Kodu:
    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 Kodu:
    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 Kodu:
    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 Kodu:
    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 Kodu:
    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 Kodu:
    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 Kodu:
    <?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 Kodu:
    $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.

  2. #2

    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

  3. #3

    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

  4. #4

    Re: SQL Caching - Nasıl Yapılır?

    Dosya işlemleri her zaman dblere göre daha hızlı oluyor.
    FERRUH.MAVİTUNA - İnanmıyorum, yeni site!

  5. #5

    Re: SQL Caching - Nasıl Yapılır?

    Bütün bilgileri db diye bir klasörde ayrı ayrı tablolarda tutmak varken neden MySQL, mssql gibi veritabanı hikayeleri icadedilmiş ki?.. Hâlâ çözemedim ben bu olayı, çok karışık.
    Take me back to my boat on the river
    and I won't cry out any more

  6. #6

    Re: SQL Caching - Nasıl Yapılır?

    veritabanı mantığının geliştiği ilk düzenekler text dosyalar yada ASCII dosyalardı, ancak bir üsre sonra RDBMS (Relational DataBase Management System -yanlış hatırlamıyorsam-) ihtiyacı ortaya çıkmıştır. bundaki asıl amaş, bir veriyi birçok kere tekrardan kurtarıp veri boyutunu düşürmek ve hızla alakalıdır. bunun yanında indexleme, stored procedure'ler, query'ler işi oldukça basite(!) indirgemiş ve veriye ulaşmayı daha kolay hale getirmiştir.

    SQL gibi -neredeyse- bütün veritabanlarının sorgulanmasında ortak kullanılan bir yapının ortaya çıkması ile, verilerin sorgulanması ve gereken bilgilere daha hızlı ulaşılması sağlanmıştır.

    sanırım veritabanı bunun için icad edilmiştir
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  7. #7

    Re: SQL Caching - Nasıl Yapılır?

    sanırım şaka yapıyorsun .

    hızlanma yük dağılımı vede elbette db den sorgu ile almak yerine direk cacheden yüklemek nedeni iledir. dosya sisteminden okumak daha hızlıdır. ama okunan dosya içinde bir şey aranacaksa veya aynı dosya defalarca açılacaksa en basit db bile daha performanslıdır. isn't it?

    @hayalet : kodlar için sağol arşive ekledim.


    absconder elini çabuk tutmuş.

  8. #8

    Re: SQL Caching - Nasıl Yapılır?

    dosyadan okumak daha hızlıdır : çünkü ASP gibi betik dillerin dosya okuma fonksiyonları/özellikleri derlenmiş olarak dll'ler içerisinde barındırırlar, dolayısıyla compile edildiklerinden dolayı daha hızlı çalışırlar, ancak script yazıp yorumlanmaya başlanması -mesela dosya içerisinde arama- ile bu hız kaybolacaktır, çünkü ortada bir compile değil yorumlama ve işleme sözkonusu olacaktır.

    ancak veritabanına ulaştığınızda veriyi gönderen veritabanı bir program, yani compile edilmiş bir program olduğu için bu aşamada dosyadan veri aramaya göre hızlı olacaktır.

    gerçi ne derece birebir karşılaştırılabilir, orası muğlak, ama veritabanlarını sevelim/kullanalım
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  9. #9

    Re: SQL Caching - Nasıl Yapılır?

    ben yukardaki yazıyı scuda yazmıştım senin yazdığını görmeden.
    hatta gördükten sonra düzenleyip absconder elini çabuk tutmuş yazdım.
    bir yanlış anlaşılma olmasın. tekrar açıklık getirdiğin için sağol gene de.

    bir ek yapayım PHP5 kendi içinde yerleşik bir database ile birlikte gelecek. artık PHP-MySQL ikilisinin tahtı sallantıda galiba.
    neyse konuyu dağıtmayalım

  10. #10

    Re: SQL Caching - Nasıl Yapılır?

    yok yanlış anlaşılma olmadı zaten, biraz daha açıklayayım dedim o kadar
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

+ Yanıtla
Sayfa Düzeni: 1 / 3
1 2 3 SonSon

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz