CakePHP:为什么我的缓存文件在过期时会导致巨大的峰值?

标签 cakephp caching cron cakephp-2.1

我正在使用 cake 2.1.3,目前有一个页面每秒有数百次浏览,因此我使用了缓存以便更好地处理负载。问题是,一旦缓存过期,我的服务器资源以及数百个 mysql 连接就会激增。

我想知道我是否以错误的方式处理这个问题,以及我是否应该运行一个 cron 来缓存页面,而不是我当前正在做的事情,或者是否有另一种我没有想到的技术。

这是我的函数在 Controller 中的样子:

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_'
));

这是我的 View 文件中的内容:

<?php echo $callback . '('.json_encode($story).')'; ?>

我希望一旦缓存文件过期,一旦第一个人访问它,它就会创建一个新的缓存文件并为每个人提供该文件,但是因为每秒有数百人点击它,看起来像这个方法对我不起作用,也许我应该以某种方式缓存 View View ,或者也许有一种不同的缓存方式,但我没有使用。

最佳答案

听起来您或多或少已经找到了答案(自动创建缓存,而不是由用户请求触发)。

为此,请查看 cake 的 AppShell 类 book talks about it here 。然后您可以将其链接到 cron 作业。如果您通过 Cache::write 创建文件,cake 应该知道它是一个新的缓存文件并透明地读取它。您可能希望将“如果找不到缓存” block 保留在那里,以防您的 cronjob 失败。

cake 中的 Shell 和任务很有趣,可以让您的应用程序不再专门使用请求/响应模型。

关于CakePHP:为什么我的缓存文件在过期时会导致巨大的峰值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15341923/

相关文章:

javascript - jQuery UI 日期选择器 - 类型错误 : O is undefined

PHP 警告 : include(/var/www/html/. ...../lib/Cake/Error/ErrorHandler.php): 无法打开流错误

mysql - 在多个列字符串比较中获取与字符串比较匹配的列名

caching - docker build --no-cache=true 仍然使用缓存构建?

html - 最佳实践翻译 CakePHP 3.x __ 函数

javascript - 在 Rails 中,如何强制更新客户端的 js/css 文件?

c - 是否可以绕过多核处理器中的 L1 缓存

node.js - 使用 node-cron 使用 mongoose 更新多个文档

php - 从另一个 cron 作业创建 cron 作业

date - 将当前日期添加到文件名时出现 mysqldump 错误