-
sudo apt-get update
-
sudo apt-get install mysql-server php5-mysql php5 php5-memcache
-
sudo apt-get install memcached
-
sudo apt-get install php-pear
-
sudo apt-get install build-essential
-
sudo pecl install memcache
-
echo "extension=memcache.so" | sudo tee /etc/php5/conf.d/memcache.ini
2. Memcache Kontrolü ve Durum Görüntülenmesi:
-
ps aux | grep memcache
-
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:
-
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
4. Memcache İle Alakalı Basit Örnek:
-
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;
-
nano memcachetest.php
- Öncelikle aşağıda bulunan komut ile Memcache bağlantı kuralım. Daha önceden belirtiğim üzere Memcache 11211 portu üzerinden çalışmaktadır.
-
<?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.
-
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:
-
$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:
-
$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; ?>
-
<?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; ?>
-
# 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.