Я использую cake 2.1.3 и в настоящее время имею страницу, которая получает сотни просмотров в секунду, и поэтому я использовал кэширование, чтобы лучше справляться с нагрузкой. Проблема в том, что, как только кеш истекает, я получаю всплеск в моих ресурсах сервера, а также сотни соединений mysql.CakePHP: Почему мой кешированный файл вызывает огромные всплески, когда он истекает?
Мне интересно, не буду ли я делать это неправильно, и если я должен запустить cron для кэширования страницы, а не того, как я это делаю сейчас, или если есть другая техника, о которой я не думаю ,
вот что моя функция выглядит в моем контроллере:
public function index() {
$this->layout = 'ajax';
if (isset($this->params['url']['callback'])) {
$callback = $this->params['url']['callback'];
}else{
$callback = 'callback';
}
$this->set('callback',$callback);
$today = date("Y-m-d");
$end_date = strtotime ('+1 day' , strtotime($today)) ;
$end_date = date ('Y-m-d' , $end_date);
$start_date = strtotime ('-1 day' , strtotime($today)) ;
$start_date = date ('Y-m-d' , $start_date);
$total = Cache::read('popular_stories', 'short');
if (!$total) {
$total = $this->TrackStoryView->find('all', array(
'fields' => array('COUNT(story_id) AS theCount', 'headline', 'url'),
'conditions' => array('date BETWEEN ? AND ?' => array($start_date,$end_date)),
'group' => 'story_id',
'order' => array('theCount DESC'),
'limit' => 20,
));
Cache::write('popular_stories', $total, 'short');
}
$this->set('story', $total);
}
Вот что мой кэш конфигурация выглядит в моем bootstrap.php файл:
Cache::config('short', array(
'engine' => 'File',
'duration' => '+60 minutes',
'path' => CACHE,
'prefix' => 'cake_short_'
));
Это то, что в моем файле представления:
<?php echo $callback . '('.json_encode($story).')'; ?>
Я надеялся, что когда-то т он кэширует файл, как только первый человек получит доступ к нему, он будет радовать новый файл в кэше и подаст его на всех, однако, поскольку сотни людей попадают в него в секунду, похоже, что этот метод не работает для меня и что, возможно, я должен как-то кэшировать представление вида cron или, возможно, есть другой способ кэширования, который я не использую.
+1 за то, что вы обновили кеш, когда что-то обновлено (если возможно, с вашим приложением), поскольку это будет еще более эффективно, чем запуск cron каждые x минут/часов, когда это может даже не понадобиться. – Joseph
Я бы согласился с обновлением 'afterSave()', однако это не совсем работает для этого конкретного экземпляра, потому что я обновляю базу данных с новой записью каждый раз, когда просматривается история. – bigmike7801