Ubuntuda Memcache Kurulumu

Memcache, sunucunuzu hızlandırmak amacıyla kullanılan bir önbellek mekanizmasıdır. Memcache sistemi sayesinde cachelenmiş datanız RAM bellekte tutulmakta ve herhangi bir istek geldiğinde hızlı şekilde veri kullanıcıya iletilmektedir. Örneğin, ilk aşamada data veritabanından getirilmekte ve memcache kayıt edilmektedir. Sonrasındaki isteklerde ise veritabanına erişim yerine RAM de tutulan bu datanın kullanıcıya iletilmesi sağlanmaktadır. Ubuntu 12.04 kurulu olan sisteminizde memcache kurulumuna başlamadan önce sisteminizde bulunan paket programların güncel olduğundan emin olmanız için aşağıda bulunan komutu terminalinize yazıp çalıştırınız:
  1. sudo apt-get update
    
Ayrıca Memcache kurulumu sonrasında örnek çalışmayı gerçekleştirebilmemiz adına sisteminizde Php ve MySQL kurulumunu sağlamanız gerekmektedir:
  1. sudo apt-get install mysql-server php5-mysql php5 php5-memcache
    
1. Memcache Kurulumu:
Memcache kurulumunu kolaylıkla birkaç adımda gerçekleştireceğiz. apt-get komutu ile memcache kurulumunu sağlamak için aşağıda bulunan komutu kullanınız:
  1. sudo apt-get install memcached
Sonrasında ise memcache packagelerinin tutulduğu php-pear packetinin indirilmesi gerekmektedir:
  1. sudo apt-get install php-pear
Eğer serverinizde derleyici bulunmuyorsa, build-essential üzerinden kurulum işlemini yapabilirsiniz:
  1. sudo apt-get install build-essential
Son olarak PECL(PHP Extension Community Library) kullanarak memcache kurulumunu gerçekleştirelim:
  1. sudo pecl install memcache
Kurulum süresince karşınıza gelen tüm sorulara y tuşuna basarak kurulumu bitirebilirsiniz. PECL kullanarak yapılan kurulum sonrasında memcache.ini dosyasına aşağıda bulunan komutla memcache driverini ekleyebilirsiniz:
  1. echo "extension=memcache.so" | sudo tee /etc/php5/conf.d/memcache.ini
Son komutla birlikte artık memcache sistemimizde kurulmuş oldu. Artık memcache kullanımını gerçekleştirebiliriz.

2. Memcache Kontrolü ve Durum Görüntülenmesi:
Memcache serverimizde default olarak 11211 portunu kullanmaktadır. Kurulum işleminin gerçekleştirilmesinin ardından aşağıda bulunan komutla memcachenin çalışıp çalışmadığını kontrol edebiliriz:
  1. ps aux | grep memcache
Ayrıca memcache durumuyla alakalı bilgi almak içinde aşağıda bulunan komutu kullanabilirsiniz:
  1. echo "stats settings" | nc localhost 11211
3. Memcache Nasıl Çalışır:
Memcache sunucularda key,value mantığında çalışmaktadır. Kayıt edilen dataların hepsi unique bir keye sahip olması gerekmektedir. Kullanıcı sunucuya istekte bulunduğunda ilk olarak gelen data ile ilişkilendirilmiş key olup olmadığı Memcache üzerinde kontrol edilir. Eğer mevcut keye ait herhangi bir veri yoksa, veritabanından veri çekilecek şekilde script çalışır. Sonrasında veritabanından getirilen veriler mevcut key ile Memcache kayıt edilmektedir. Artık kayıt Memcachede tutulmaktadır. Bir sonraki kullanıcı isteğinde data artık Memcache üzerinden dönecektir. Kullanıcı memcache yapısına data eklerken expire time verisini de ekleyebilir. Yani kayıt edilen datanın silinme süresi memcacheden. Böylelikle belirli periyotlarla data silinip, güncel hali veritabanından getirilip tekrar içerik güncellemesi yapılması sağlanabilir. Sistemin nasıl çalıştığını daha iyi anlamamız için aşağıda bulunan basit kod parçacığını inceleyebilirsiniz:
  1. function kitapisminigetir(kitap_id) 
        #kitap isminin memcachede kayıtlı olup olmadığını kontrol edelim.
        kitapismi = memcached_get("kitapismi:" . kitap_id) 
        return kitapismi if defined kitapismi 
    
        #veritabanından kitap ismini getirelim.
        kitapismi = veritabanindangetir(kitap_id) 
        #veritabanından getirilen kitapismini memcache kayıt edelim.
        memcached_set("kitapismi:" . kitap_id, kitapismi)
        return kitapismi
    end
Yukarıda bulunan metodda gördüğünüz üzere eğer memcachede kitapismi:kitap_id sine ait herhangi bir kayıt olsaydı metod bunu return edecekti. Eğer kayıt bulunmuyorsa altta bulunan veritabanindangetir() metodu ile icerik getirilip memcache_set() ile memcache e kayıt edilmektedir.

4. Memcache İle Alakalı Basit Örnek:
 Bu bölümümüzde ise Php, MySQL kullanarak memcache mekanizmasının nasıl çalıştığı ile alakalı basit bir örnek program yapacağız. Öncelikle mysql -u root -p komutu ile mysql veritabanına giriş yapmanız gerekmektedir. test adında bir veritabanı oluşturup testkullanici kullanıcı adına sahip ve testsifre şifresinde bir kullanıcı kaydı oluşturalım. Bu kullanıcıyı da test veritabanına erişebilecek şekilde ayarlayalım. Bu işlemleri aşağıda bulunan komutlarla gerçekleştirelim:
  1. mysql -u root -p
    
    use test; 
    
    grant all on test.* to testkullanici@localhost identified by 'testsifre'; 
    
    create table ornek (id int, ad varchar(30)); 
    
    insert into ornek values (1, "ornekveri1"); 
    insert into ornek values (2, "ornekveri2");
    insert into ornek values (3, "ornekveri3");
    
    exit;
Exit komutu ile mysql terminalinden çıktıktan sonra aşağıda bulunan komutla memcachetest.php dosyasını oluşturalım:
  1. nano memcachetest.php
    
Aşağıda dosya içerisine yazılacak olan komutları satır satır sizlerle paylaşıyorum. Detaylı olarak satırlarla ilgili bilgilendirmelerin ardından tüm kodlamayı en altta sizlerle paylaşacağım:
  • Öncelikle aşağıda bulunan komut ile Memcache bağlantı kuralım. Daha önceden belirtiğim üzere Memcache 11211 portu üzerinden çalışmaktadır.
  1. <?php 
    $memcachebaglanti = new Memcache(); 
    $memcachebaglanti->pconnect('localhost', 11211);
  • Bir sonraki aşamada ise MySQL veritabanına bağlanalım. Yukarıdaki maddelerde test isimli bir veritabanına testkullanici adında ve testsifre isimli bir passwordu olan kullanıcı oluşturmuştuk. Bu maddede onları kullanacağız. 
  1. mysql_connect("localhost", "testkullanici", "testsifre") or die(mysql_error()); 
    mysql_select_db("test") or die(mysql_error());
  • Sonrasında Memcachede datanın kayıt edilmesinde kullanılacak bir key belirleyelim. Bunun unique olması önemlidir. Çünkü aynı istekte gelen sorgular için Memcache üzerinden datanın sunulması gerekecektir. Bunun için MySQL sorgusunu bu işlem için kullanabiliriz. Yapılacak sorguyu md5 formatına çekip key olarak kullanalım:
  1. $sorgu = "select id from ornek where ad= 'ornekveri1'"; 
    $sorguAnahtari = "ANAHTARKELIME :" . md5($sorgu);
  • Yukarıda oluşturulan sorguAnahtari ile ilk olarak Memcache kontrol edilecek. Bu key sistemde bulunuyorsa veri direkt bu key üzerinden verilecektir. Eğer yoksa veritabanına sorgu yapılacaktır. Dönen veri ise memcache yapısına yukarıdaki key ile kayıt edilecektir. Verinin tutulma süresi olarakta 300 saniye yani 5 dakikaya kullanacağım. Aşağıda bu konuyla alakalı kodlama bulunmaktadır:
  1. $sonuc = $memcachebaglanti->get($sorguAnahtari); 
    
    if (!$sonuc) { 
        $sonuc = mysql_fetch_array(mysql_query("select id from ornek where ad = 'ornekveri1'")) or die('mysql error'); 
        $memcachebaglanti->set($sorguAnahtari, $sonuc, 0, 300); 
        print "sonuc veritabanından getirildi\n"; 
        return $sonuc; 
    } 
    
    
    print "sonuc memcacheden getirildi\n"; 
    return $sonuc; 
    
    ?>
    
Yukarıda madde madde anlatılan scriptin tam hali şu şekildedir:
  1. <?php 
    $memcachebaglanti = new Memcache(); 
    $memcachebaglanti->pconnect('localhost', 11211); 
    
    mysql_connect("localhost", "testkullanici", "testsifre") or die(mysql_error()); 
    mysql_select_db("test") or die(mysql_error()); 
    
    $sorgu = "select id from ornek where ad= 'ornekveri1'"; 
    $sorguAnahtari = "ANAHTARKELIME: " . md5($sorgu); 
    
    $sonuc = $memcachebaglanti->get($sorguAnahtari); 
    
    if (!$sonuc) { 
    $sonuc = mysql_fetch_array(mysql_query("select id from ornek where ad= 'ornekveri1'")) or die('mysql error'); 
    $memcachebaglanti->set($sorguAnahtari, $sonuc, 0, 300); 
    print "sonuc veritabanından getirildi\n"; 
    return $sonuc; 
    } 
    
    print "sonuc memcacheden getirildi\n"; 
    return $sonuc; 
    
    ?>
    
Aşağıda birkaç kez memcachtest.php scripti çalıştırıldığında ortaya çıkacak çıktı şu şekilde olacaktır:
  1. # php memcachetest.php 
    sonuc veritabanından getirildi
    
    # php memcachetest.php 
    sonuc memcacheden getirildi
    
    # php memcachetest.php 
    sonuc memcacheden getirildi. 
    
    # php memcachetest.php << 5 dakika sonraki sorguda tekrar veritabanından getirilecektir.
    sonuc veritabanından getirildi.
    
    # php memcachetest.php
    sonuc memcachden getirildi.

comments powered by Disqus