James Zaghini
James Zaghini

Reputation: 4011

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...

Upvotes: 0

Views: 2221

Answers (4)

Joe
Joe

Reputation: 11

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

Upvotes: 1

Joe
Joe

Reputation: 26

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

} 

Upvotes: 1

Kien Pham
Kien Pham

Reputation: 2779

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

Upvotes: 0

metrobalderas
metrobalderas

Reputation: 5240

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.

Upvotes: 0

Related Questions