Web programlama ile uğraşan kişiler belirli bir aşamadan sonra projelerinde, hem sunucu üzerindeki yükü azaltmak, hem de hız ve performans artışı için cache‘leme mekanizmalarına ihtiyaç duyarlar. Hele PHP gibi her çalıştığında derlenen bir dil kullanıyorsanız çoğu projenizde cache kullanmanız gerekir (gerçi ben üşengeçliğimden ufak işlerde kullanmıyorum, siz yaptığımı değil, dediğimi yapın :))
PHP ile cache’leme işlemenin bir kaç yolu var. Derlenmiş, makina diline çevrilmiş kodu saklayıp bir sonraki ziyarette sayfayı tekrar derlemeden cache’deki kodun çalıştırılması (opcode cache), sayfada kullanılacak verilerin kaynaklardan alındıktan sonra bir dosyada tutulup gerektiğinde dosyadan çağrılması (file cache), verilerin dosyada değil de hafızada (ram’de) saklanması yöntemi (memory cache).
Bu yazıda PHP memory cache’leme yönteminde kullanılan APC yazılımını kullanan bir sınıfı inceleyeceğiz. Öncelikle APC’nin sunucunuzda aktif olup olmadığından emin olun (phpinfo()’dan öğrenebilirsiniz). Aktif değilse gerekli ayarları yapıp (.dll temini ve php.ini extension parametresi) kullanılabilir hale getirin.
class APC_Cache { // time to live süresi var $expire = 600; public function get($key) { return apc_fetch($key); } public function set($key, $data, $ttl = NULL) { if (intval($ttl) == 0) $ttl = $this->expire; apc_store($key, $data, $ttl); } public function replace($key, $data) { apc_delete($key); apc_store($key, $data, $this->expire); } public function delete($key) { apc_delete($key); } public function clear($type = 'user') { apc_clear_cache($type); } }
Yukarıda sınıf ile APC sistemini kolaylıkla kullanabilirsiniz. Set metoduyla saklanan veri get metoduyla hafızadan alınıyor. Build-in bir replace metodu olmadığı için sınıfımızdaki replace metodunda önce veriyi silip ardından set ediyoruz. Delete metoduyla tek bir kaydı, clear ile tüm cache’lenmiş kayıtları siliyoruz.
Sınıfın kullanımı şu şekilde;
require('class.apc.php'); $cache = new APC_Cache; if ( ! $data = $cache->get('q1') ) { $data = array(); $sorgu = mysql_query('SELECT * FROM tablo') OR die(mysql_error()); while($row = mysql_fetch_assoc($sorgu)) { $data[] = $row; } $cache->set('q1', $data, 300); // 5 dakikalık bir ttl ile hafızada tutulacak } print_r($data);
Yukarıda q1 ile etiketlediğimiz kaydımızın varlığını kontrol ediyoruz. Eğer q1 kaydı hafızada yoksa ya da zaman aşımına uğramışsa veriyi kaynaktan çekip sonrada hafızaya set ediyoruz. Sayfayı ilk açtığınızda veri tabanından gerekli bilgiyi alan kod bloğu, ikinci açılışta bu bilgileri hafızadan çok daha kısa sürede getirecektir. Bu örnekte APC ile hafızada bir dizi tutuluyor fakat siz isterseniz bir nesneyi de saklayabilirsiniz.
Eğer tek bir sunucu üzerinde çalışıyorsanız APC sizin için ideal bir cache’leme sistemi olacaktır. Fakat birden fazla sunucu kullanan cache’leme mekanizmaları da mevcut. Bunlardan en çok kullanılanı Memcached. İlerleyen zamanlarda Memcached’ın kullanımını da anlatmaya çalışacağım.





Yazınız cok güzel ama ciddi bir eksik var. Haydi cache de yoksa cacheliyoruz? Ya varsa ne yapıcaz?
@Faruk Hakan, cache’de varsa zaten ilk if kontrolü içinde $data değişkenine cache’deki değer atanıyor.