2010-02-24 99 views
0

我有一个歌曲控制器。在歌曲控制器我有一个 '视图' 行动,其获得的传送ID,例如Cakephp缓存每个动作只缓存一个文件

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

当用户访问/歌曲/查看/ 1,该文件被正确缓存并保存为“songs_view_1.php”

现在的问题,当打到用户的不同的歌曲,例如:/歌曲/图/ 2,'songs_view_1.php'被删除,'/songs/view/2.ph p'就在它的位置。

如果我不访问其他网址,并且访问其他操作不会影响任何其他操作的缓存文件,则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" 
); 

将缓存 '视图/ 1' 或 '视图/ 2',但正如前面删除以前的页面。如果我参观“/视图/ 3”,它会删除前的缓存页面... 叹息

编辑:

与具有相同的代码,另一台服务器上的同一个问题...

回答

1

这方面的工作小时之后,我终于明白,为什么缓存保持被删除的原因,是因为你有一些操作数据库中的更新您的“歌”记录您查看“歌后”。就我而言,我在我的数据库中保留了一个名为'Hits'的列来存储命中次数/读数,并且每次读取记录时都会更新它。

Cakephp具有一种功能,可以检测数据库的更改并清除缓存。

尝试删除任何更新您的'歌曲'记录并且cacheaction应该正常工作的操作。

另一种方法是重新定义'歌曲'模型中的clearcache函数...它将禁用自动清除缓存的函数..但是请记住在执行更新时手动清除缓存。

function _clearCache($type = null) { 

} 
+0

这很好,在覆盖clearCache函数时我无法使用它,但当我有更多时间时,我会再去一次。 我正在更新数据库中的每个歌曲的点击次数,这就是问题所在。 这让我沮丧几个月!我不敢相信这很简单。谢谢。 – 2010-05-04 23:58:03

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

希望它能帮助。

+1

缓存查询结果和缓存呈现的页面是不太一样的。什么时候页面缓存被弃用? – deceze 2010-02-24 05:29:24

+0

我说'我想'。 – metrobalderas 2010-02-24 06:48:51

+1

那么请不要没有任何参考地说出来。我开始怀疑我是否无法将我的网站更新到更新的Cake版本,因为我正在使用页面缓存。 :) – deceze 2010-02-24 07:52:05

0

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

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

是的,我有这些确切的设置。 – 2010-02-25 22:56:46

1

在这段时间的工作时间后,我终于找出缓存不断被删除的原因。 原因是因为在查看'歌曲'后,您有一些操作可以更新数据库中的'歌曲'记录。就我而言,我在我的数据库中保留了一个名为'Hits'的列来存储命中次数/读数,并且每次读取记录时都会更新它。

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

尝试删除任何更新您的'歌曲'记录的操作,并且cacheaction应该正常工作。

修复后,会出现另一个问题。比方说,如果有任何更新任何 1的记录...缓存歌曲/ 1,歌曲/ 5,歌曲/ 100 ...等等的所有缓存, 1,歌曲/ 5,歌曲/ 100将被删除。这使得cacheaction经常更新网站无用。

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

function _clearCache($type = null) { 

} 

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

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