Cakephp缓存每个操作仅缓存一个文件

时间:2010-02-24 01:05:23

标签: cakephp caching

我有一个歌曲控制器。在歌曲控制器中,我有一个'视图'动作,它被传递了一个id,例如

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

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

现在针对这个问题,当用户点击不同的歌曲时,例如/ songs / view / 2,'songs_view_1.php'将被删除,并且'/songs/view/2.php'就在其中。

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

我已经尝试更换我的'cake'文件夹(从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 个答案:

答案 0 :(得分:1)

在这个工作时间之后,我终于找出了缓存被删除的原因,REASON是因为你有一些操作在你查看'歌曲'后更新数据库中的'歌曲'记录。对于我的情况,我在我的数据库中保留一个名为'Hits'的列来存储命中/读取的数量,并且每次读取记录时它都会更新它。

Cakephp有一个功能,可以动态检测数据库的更改并为您清除缓存。

尝试删除更新“歌曲”记录的任何操作,并且缓存操作应该正常工作。

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

function _clearCache($type = null) {

} 

答案 1 :(得分:1)

在这个工作时间之后,我终于找到了缓存继续被删除的原因。 原因是因为您在查看“歌曲”后有一些操作可以更新数据库中的“歌曲”记录。对于我的情况,我在我的数据库中保留一个名为“Hits”的列来存储命中/读取的数量,并且每次读取记录时都会更新它。

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

尝试删除更新“歌曲”记录的所有操作,cacheaction应该正常运行。

修好之后,会有另一个问题。假设您缓存了许多记录,例如歌曲/ 1,歌曲/ 5,歌曲/ 100等等,如果任何 1记录有任何更新...全部歌曲/ 1,歌曲/ 5,歌曲/ 100的缓存将被删除。这使cacheaction对于频繁更新网站无效。

解决方案是重新定义“歌曲”模型中的clearcache函数...它将禁用自动清除缓存的功能..所以如果有任何更新,则没有缓存将被删除。但是请记住在执行更新时自己手动清除缓存。

function _clearCache($type = null) {

} 

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

@unlink(CACHE.'views'.DS.'website_songs_view_50.php'); 

答案 2 :(得分:0)

我认为这种缓存方法已被弃用。也许您应该使用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));

希望它有所帮助。

答案 3 :(得分:0)

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

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