Cakephp кеширует только один файл за действие - PullRequest
0 голосов
/ 24 февраля 2010

У меня есть контроллер песен. В контроллере песен у меня есть действие просмотра, которое получает идентификатор, например,

  • / песни / вид / 1
  • / песни / вид / 5
  • / песни / вид / 500

Когда пользователь посещает / песни / просмотр / 1, файл кэшируется правильно и сохраняется как 'songs_view_1.php'

Теперь проблема: когда пользователь нажимает другую песню, например, / songs / view / 2, «songs_view_1.php» удаляется и «/songs/view/2.php» находится на своем месте.

Файлы cahced будут оставаться там в течение дня, если я не посещу другой URL, а посещение другого действия не повлияет на кэшированный файл любого другого действия.

Я пытался заменить папку «торт» (с 1.2 на 1.2.6), но ничего не сделал. Я не получаю никаких сообщений об ошибках и ничего в журналах.

Вот мой код, я перепробовал множество вариаций, все с одной и той же проблемой.

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

Есть идеи?

EDIT:

После еще одного тестирования этот код

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

кеширует «view / 1» или «view / 2», но удаляет предыдущую страницу, как и раньше. Если я захожу в '/ view / 3', он будет удалять кэшированную страницу раньше ... sigh

EDIT:

Наличие той же проблемы на другом сервере с тем же кодом ...

Ответы [ 4 ]

1 голос
/ 05 мая 2010

После долгих часов работы я наконец выяснил причину, по которой кэш продолжает удаляться. Причина заключается в том, что у вас были некоторые операции, которые обновляли вашу запись «песни» в базе данных после просмотра «песни». Для моего случая я храню в своей базе данных столбец с именем «Хиты», в котором хранится количество обращений / чтений, и обновляет его каждый раз, когда читает запись.

Cakephp имеет функцию автоматического обнаружения изменений в вашей базе данных и очистки кеша для вас.

Попробуйте удалить все операции, которые обновляют вашу запись песни, и cacheaction должен работать правильно.

После исправления возникнет еще одна проблема. Допустим, вы кэшируете многие из своих записей, например, song / 1, song / 5, song / 100 ... и т. Д., Если есть какое-либо обновление для любой 1 записи ... всех кэши для песни / 1, песни / 5, песни / 100 будут удалены. Это делает cacheaction бесполезным для частого обновления сайта.

Решением этой проблемы является переопределение функции clearcache в вашей модели «песни» ... она отключит функцию автоматического удаления из кэша .. поэтому, если есть какое-либо обновление, ни один из кэшей не будет быть удаленным. Но затем не забудьте вручную очистить кеш при выполнении обновления.

function _clearCache($type = null) {

} 

для удаления кэша вручную, вы можете использовать

@unlink(CACHE.'views'.DS.'website_songs_view_50.php'); 
1 голос
/ 04 мая 2010

После нескольких часов работы над этим я наконец выяснил причину, по которой кэш продолжает удаляться, ПРИЧИНА в том, что у вас были некоторые операции, которые обновляли вашу запись «песни» в базе данных после просмотра «песни». Для моего случая я храню столбец в моей базе данных с именем «Хиты», чтобы хранить количество обращений / чтений, и он обновляет его каждый раз, когда читает запись.

Cakephp имеет функцию, которая автоматически обнаруживает изменения в вашей базе данных и очищает кеш для вас.

Попробуйте удалить все операции, которые обновляют вашу запись песни, и кэширование должно работать правильно.

Альтернативой является переопределение функции clearcache в вашей модели «песни» ... она отключит функцию автоматического удаления из кэша ... но затем не забудьте вручную очистить кэш при выполнении обновления.

function _clearCache($type = null) {

} 
0 голосов
/ 26 февраля 2010

Проверьте некоторые настройки в файле config.php.У вас включены следующие настройки?

Configure::write('debug', 0);
//Configure::write('Cache.disable', true);
Configure::write('Cache.check', true);
Cache::config('default', array('engine' => 'File'));
0 голосов
/ 24 февраля 2010

Я думаю, что такой метод кэширования не поддерживается. Возможно, вам следует использовать 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));

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...