Monday, December 28, 2015

Wednesday, July 4, 2012

Zend_Cache ile Cache(Önbellekleme)

Cache 

Tekrar kullanımı muhtemel verilerin ulaşımı daha kolay ve daha hızlı olan bir alanda tutulması ve gerektiğinde  tekrar o alandan okunmasıdır.Web tabanlı uygulamalarda cache işlemi; hem static sayfalarda, hem de  bir SQL sorgusunun sonuç setinde olsun; uygulama için performans açısından oldukça önemli bir unsurdur. 
Cache işleminde en önemli nokta ise nerede-ne zaman kullanılmasına nasıl karar verileceğidir. Yanlış kullanım ise başımaza güvenlik, gizlilik ihlali, vb. sorunlar çıkartabilir.


Caching Güvenlik Husuları

Aşağıda caching işlemi yaparken dikkat edilmesi gereken belli başlı hususlar sıraladım:
  • Cache işlemi yaptığın yerde üretilen sayfa/veri ve sonrsında üretilecek veri hep aynı olmalıdır. Buna en güzel örnek  ana sayfalardır.
  • Kişisel bilgileri içeren herhangi bir veriyi kesinlikle cache 'lememelisin. Bu kullanıcı bilgilerinin gizliliğini tehlikeye sokar.
  • Olusturduğun güvenlik aşamalarını bir sayfa çıktısını cache 'lerken aşılmamasından ve herhangi bir kullanıcının cache 'lediği  bir sayfayı diğer kullanıcıların okumasını önlediğinden emin olmalısın.

Zend_Cache Bileşeni

Zend_Cache cache için bir çok olanak sağlar. Frontend ve backend olmak üzere iki ana parça var. Frontend neyi, nasıl cache 'leyeceğinin kararını tutarken; backend nasıl depolanacağını tutar. Bunlar basit bir kaç kelimeyle açıklayayım:

Zend_Cache Frontend Sınıfları:

  • Zend_Cache_Core : load($handle) ve save($data) metotları ile en genel amaçlar için kullanılır. Bu sınıf tüm diğer frontend sınıflarının temel sınıfıdır ve bir çok işe yarar ayarına sahip. Daha fazla bilgi için buradan...
  • Zend_Cache_Frontend_Output : $cache->start() ile $cache->end() metotları arasında ki tüm çıktıyı önbelleğe alır. Tüm sayfa cache 'lenmesinin mümkün olmadığı durumlarda kullanımı hayat kurtarır.
  • Zend_Cache_Frontend_Function : Herhangibir fonksiyon çıktısını direk olarak  önbelleğe alabilirsiniz. call(callback $function, array $params) şeklinde kullanılır.
  • Zend_Cache_Frontend_Class : Serialize/Deserialize edilebilen nesnelerde kullanılabilir. Bu sayede tekrar tekrar veri tabanına ya da yapılandırma dosyalarına gidilmesine gerek duyulmadan işlem yapabilirsin. Bu sınıfı kullanımı için 'cachedEntity' seçeneğine önbelleğe alınacak sınıf örneği atanmalı. Çağırmak ise oldukça basit. $cache->methodName($name)
  • Zend_Cache_Frontend_File : Core frontend ile hemen hemen aynı. Farklı olan kısmı ise cache 'lenen dosya eğer değiştirilirse cache tekrar yüklenir. 'master_file' => 'path/to/file' direktifi ile hedef dosya belirlenir.
  • Zend_Cache_Frontend_Page : 'regexps' direktifi ile belirlenen (frontend ayarları) sayfaları önbelleğe alır ve TTL süresince (yada lifetime) gelen isteklere cevap öenbellekten verilir.

Zend_Cache Backend Sınıfları :


  • Zend_Cache_Backend_File : Cache nesnelerini dosyaya kaydeden en temel back-end sınıfı. Nesnleri depolayacağın yeri 'cache_dir' direktifi ile belirtilen dizine kaydeder. NOT :Cache dizini www-data kullanıcısı tarafından yazılabilir olmalı.
  • Zend_Cache_Backend_Sqlite : Önbelleğe alıncak nesneleri SQLite dosyalarında tutan back-end sınıfıdır.cache_db_complete_path  back-end direktifi ile sqlite dosyasının yolu verilmelidir.
  • Zend_Cache_Backend_Memcached : Nesneleri memcached sunucusunda tutan back-end sınıfı. Bu sınıfın kullanımı için Memecached sunucusu için gerekli olan bilgiler bu backend sınıfına array olarak geçilmelidir.
  • Zend_Cache_Backend_Apc : Php 'nin opcode cache eklentisi olan Apc için adaper bir sınıftır. Sunucunda apc  (ki php 'de ilk kurulumda direk olarak gelmez) eklentisi aktif ise başka bir ayara gerek yok.

Zend_Cache_Manager 

Karmaşık bir Zend Framework uygulamasında farklı farklı frontend ve backend türünde Cache nesnelerine ihtiyaç duyabilirsinin.Bu cache nesnelerini yönetmek için zend framework Zend_Cache_Manager bileşenini sağlamış. $cacheManager->setCache('tag', $cacheInstance) şeklinde set edilir ve tekrar kullanmak için ise, $cacheManager->getCache('tag') metodu ile tekrar aynı örneği elde edebilir ve kullanabilirsin. Tüm anlattıklarımın özeti olarak aşağıdaki kod örneklerini inceleyebilirsiniz.

/www/application/Bootstrap.php




/www/application/controllers/IndexController.php