суббота, 12 сентября 2009 г.

Прикручиваем resuestAction к Cache-у

В документации Cakephp 1.2 говорится о том что если requestAction используется без кеширования, то то может уменьшить производительность.
If used without caching requestAction can lead to poor performance. It is rarely appropriate to use in a controller or model.
И правда, сами подумайте, каждый раз при просмотре сайта, кроме основнфх запросов к базе, делается куча мелких, с помощью requestAction-ов...
И как истинные политики, они говорят что может произойти, при этом не говоря КАК это избежать.
Привожу пример того, как с этим разбираюсь я. Это не догмат. Потому буду признателен чужим мнениям, тем более, что Вы, дорогие читатели, не чужие!

Коротко, о том как работает requestAction:
requestAction обычно используется вo view-файле (папка views). из view-файла, вы делаете запрос на другую страницу, и получаете значение.
синтаксис requestAction-а таков: $this->requestAction('/articles/home');
который говорит Cakephp что надо сделать запрос по адресу http://адрес.сайта/articles/home
в самом контроллере к которому обращается requestAction надо прописать return;
function home(){
   $out = $this->Article->find('all');
   Cache::write('articleHome', $out);
   return $out;
}

теперь мы можем смело дописать к $this->requestAction('/articles/home'); следующие строки
$out = Cache::read('articlesHome');
if(empty($out)){
   $out = $this->requestAction('/articles/home');
}

и теперь при каждом обновлении этого списка, если мы что-то добавили/изменили не забываем перезаписывать: Cache::write('articleHome', $out);