开发者

Cakephp cache only caching one file per action

I have a songs controller. Within the songs controller i have a 'view' action which get's passed an id, eg

When a user visits /songs/view/1, the file is cached correctly and saved as 'songs_view_1.php'

Now for the problem, when a user hit's a different song, eg /songs/view/2, the 'songs_view_1.php' is deleted and '/songs/view/2.php' is in it's place.

The cahced files will stay there for a day if I don't visit a different url, and visiting a different action will not affect any other action's cached file.

I've tried replacing my 'cake' folder (from 1.2 to 1.2.6), but that didn't do anything. I get no error messages at all and nothing in the logs.

Here's my code, I've tried umpteen variations all ending up with the same problem.

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

Any ideas?

EDIT:

After some more testing, this code

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

will cache 'view/1' or 'view/2', but delete the previous page as before. If I visit '/view/3' it will delete the cached page from before... sigh

EDIT:

Having the same issue on another server with same code...


After working hours on this, I finally figure out the reason why the cache keep being deleted, the REASON is because you had some operations that update your 'song' record in the database after you view the 'song'. For my case, I keep a column in my database called 'Hits' to store the number of hits/reads, and it updates it everytime it read the record.

Cakephp has a feature to aumotically detect changes to your database and clear the cache for you.

Try remove any operations that update your 'song' record and the cacheaction should be working properly.

An alternative is to redefine the clearcache function in your 'song' model... it will disable the function to auto-clear off the cache.. but then remember to manually clear the cache yourself when an update is performed.

function _clearCache($type = null) {

} 


After working hours on this, I finally figured out the reason why the cache keeps on being deleted. The reason is because you had some operations that update your 'song' record in the database after you view the 'song'. For my case, I keep a column in my database called 'Hits' to store the number of hits/reads, and it updates it everytime it read the record.

Cakephp has a feature to automatically detect changes to your database and clear the cache for you.

Try remove any operations that update your 'song' record and the cacheaction should work properly.

After fixing it, there will be another issue. Let's say you cache many of your records, for example song/1, song/5, song/100...etc, if there is any update for any 1 of the record... all of the caches for song/1, song/5, song/100 will be deleted. This makes cacheaction useless for frequently update website.

The solution to this is to redefine the clearcache function in your 'song' model... it will disable the function to auto-clear off the cache.. so if there is any update, none of the caches will be deleted. But then remember to manually clear the cache yourself when an update is performed.

function _clearCache($type = null) {

} 

to remove cache manually, you could use

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


I think that kind of caching method is depreceted. Perhaps you should use 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 is a variable you define in core.php:

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

Hope it helps.


Check some setting in the config.php file. Do you have the following setting enabled?

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜