代码之家  ›  专栏  ›  技术社区  ›  James Zaghini Gandalf

cakephp缓存每个操作只缓存一个文件

  •  0
  • James Zaghini Gandalf  · 技术社区  · 14 年前

    我有一个歌曲控制器。在歌曲控制器中,我有一个“查看”操作,它传递了一个ID,例如

    • /歌曲/视图/1
    • /歌曲/视图/ 5
    • /歌曲/视图/ 500

    当用户访问/songs/view/1时,文件被正确缓存并保存为“songs\u view\u 1.php”

    现在,对于这个问题,当用户点击的是不同的歌曲时,例如/song s/view/2,就会删除“song s\u view\u 1.php”,并使用“/song s/view/2.php”。

    如果我不访问其他URL,CAHCED文件将在那里停留一天,并且访问其他操作不会影响任何其他操作的缓存文件。

    我试过更换我的“蛋糕”文件夹(从1.2到1.2.6),但没用。我没有收到任何错误消息,日志中也没有任何内容。

    这是我的代码,我尝试过无数种变体,结果都是同一个问题。

       var $helpers = array('Cache');
       var $cacheAction = array(
           'view/' => '+1 day'
       );
    

    有什么想法吗?

    编辑:

    经过更多的测试,这个代码

    var $cacheAction = array(
        'view/1' => "1 day",
        'view/2' => "1 day"
    );
    

    将缓存“view/1”或“view/2”,但删除前一页。如果我访问“/view/3”,它将从以前的位置删除缓存页… 叹息

    编辑:

    在另一台具有相同代码的服务器上出现相同问题…

    4 回复  |  直到 12 年前
        1
  •  1
  •   Joe    14 年前

    在这方面工作了几个小时后,我终于找出了为什么缓存一直被删除的原因,原因是在您查看了“歌曲”之后,您在数据库中进行了一些更新“歌曲”记录的操作。对于我的情况,我在数据库中保留了一个名为“hits”的列来存储点击/读取次数,它每次读取记录时都会更新它。

    cakephp具有自动检测数据库更改并为您清除缓存的功能。

    尝试删除任何更新“歌曲”记录的操作,cacheAction应正常工作。

    另一种方法是重新定义“歌曲”模型中的ClearCache函数…它将禁用自动清除缓存的功能。但在执行更新时,请记住自己手动清除缓存。

    function _clearCache($type = null) {
    
    } 
    
        2
  •  1
  •   T. Junghans    12 年前

    在这方面工作了几个小时之后,我终于找到了为什么缓存一直被删除的原因。 原因 是因为在您查看“歌曲”后,有一些操作会更新数据库中的“歌曲”记录。对于我的情况,我在数据库中保留了一个名为“hits”的列来存储点击/读取次数,它每次读取记录时都会更新它。

    cakephp具有自动检测数据库更改并为您清除缓存的功能。

    尝试删除任何更新“歌曲”记录和 cacheaction 应该能正常工作。

    修好之后,还有一个问题。假设您缓存了许多记录,例如Song/1、Song/5、Song/100…等,如果有任何更新 任何 第一条记录…将删除所有Song/1、Song/5、Song/100的缓存。这使得 催乳素作用 不适合经常更新网站。

    解决方法是重新定义 clearcache 在你的“歌曲”模型中发挥作用…它将禁用自动清除缓存的功能。因此,如果有任何更新,则不会删除任何缓存。但在执行更新时,请记住自己手动清除缓存。

    function _clearCache($type = null) {
    
    } 
    

    要手动删除缓存,可以使用

    @unlink(CACHE.'views'.DS.'website_songs_view_50.php'); 
    
        3
  •  0
  •   metrobalderas    14 年前

    我认为这种缓存方法是不受欢迎的。也许你应该用 Cache 以下内容:

    $song = Cache::read('songs/view/'.$id, 'cache_time');
    if(empty($song)){
        $song = $this->Song->findById($id);
        Cache::write('songs/view/'.$id, $song, 'cache_time');
    }
    

    cache_time 是在中定义的变量 core.php :

    Cache::config('cache_time', array('engine' => 'File', 'duration' => 60*60*24));
    

    希望有帮助。

        4
  •  0
  •   Kien Pham    14 年前

    检查config.php文件中的一些设置。是否启用了以下设置?

    Configure::write('debug', 0);
    //Configure::write('Cache.disable', true);
    Configure::write('Cache.check', true);
    Cache::config('default', array('engine' => 'File'));