我有一个歌曲控制器。在歌曲控制器中,我有一个'视图'动作,它被传递了一个id,例如
当用户访问/ 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',它将删除之前的缓存页面... 叹息
编辑:
在具有相同代码的另一台服务器上遇到同样的问题......
答案 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'));