Silverstripe de genellikle birbiriyle iliskili birden cok nesne ile calisiriz. Bu nesneler ile calismak kod yazarken nekadar güzel olsada, sitenin performansini oldukca etkilemektedir.
Silverstripe bu konuda cok kolay bir cache Sistemi kullanmakda.
Böyle basit bir sorgumuz var sayalim
$result = DataObject::get('ProductCategory',"URLSegment='".Convert::raw2sql($urlSegment)."'");
Bu sorgu icin yeni bir fonksiyon yazalim ve bakalim sorunu nasil cözeriz.
protected function getCategoryID($urlSegment) { //cachekey olusturalim //preg_replace kullanmamiz lazim cünki Zend_Cache a-zA-Z_0-9 disindaki karakterlere izin vermiyor $cachekey = 'Cache_Category'.preg_replace('/-/','_',$urlSegment); // SS_Cache in factory methodu üzerinden cache objesini olusturalim $cache = SS_Cache::factory($cachekey); //cache yükliyelim $result = $cache->load($cachekey); //cache varsa unserialize yapip result degiskenine atiyalim if ($result) { $result = unserialize($result); } else { //cache yoksa veya süresi gecmisse yukaridaki sorgumuzu calistirip kaydedelim $result = DataObject::get('ProductCategory',"URLSegment='".Convert::raw2sql($urlSegment)."'"); $cache->save(serialize($result)); } return $result; }
UPDATE: 17.05.2012
Pagination ve resimli iliskilerde serialize yüzünden cikan sorunlar yüzünden cache i biraz degistirdik.
protected function getCategoryID($urlSegment) { if (!isset($_GET['start']) || !is_numeric($_GET['start'])){ $start = 0; } else { $start = intval($_GET['start']); } $cachekey = 'Cache_Category'.preg_replace('/-/','_',$urlSegment); $cache = SS_Cache::factory($cachekey); $result = $cache->load($cachekey); if ($result) { $result = unserialize($result); //kayit ettigimiz arrayi bir DataObjectSet e ceviriyoruz. $doSet = $this->buildDataObjectSet($result, 'DataObjectSet', $this->class); //pagination icin limitleri belirleyelim $doSet->setPageLimits($start, 10, $doSet->Count()); return $doSet; } else { $result = DataObject::get('ProductCategory',"URLSegment='".Convert::raw2sql($urlSegment)."'"); //tüm icerikleri bir Array e alip, cache e öyle kayit ediyoruz. if($result!= null) { $saveArr = array(); foreach($result as $value) { $saveArr[] = $value->getAllFields(); } $cache->save(serialize($saveArr)); } } return $result; }
Bu arada yukaridada yazdigim gibi SS_Cache arka planda Zend_Cache kullanmakda.
Template de degisen birsey yok.
Template cache lerine birdahaki yazimizda anlatmaya calisacagim.
Silverstripe API: http://api.silverstripe.org/2.4/sapphire/core/SS_Cache.html