Сброс отдельных страничек, закэшированных через PageCache

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
cvl
Сообщения: 25
Зарегистрирован: 2015.03.02, 08:42
Контактная информация:

Сброс отдельных страничек, закэшированных через PageCache

Сообщение cvl »

Кэширую страничку:

Код: Выделить всё

public function behaviors()
{
    return [
        'cache' => [
            'class' => 'yii\filters\PageCache',
            'only' => ['index'],
            'duration' => 120,
        ],
    ];
}
Как мне ее сбросить (очистить)?

Знаю, что есть cache->flush(), но он очищает весь кэш. Как чистить отдельные страницы? Например, нужно сбросить конкретную закэшированную страницу из другого контроллера.
Аватара пользователя
Psyhos
Сообщения: 124
Зарегистрирован: 2011.04.13, 15:04
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение Psyhos »

Надо этому кешу назначить ID и очищать потом по ID.
cvl
Сообщения: 25
Зарегистрирован: 2015.03.02, 08:42
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение cvl »

Psyhos
Это понятно. Не понятно как ключ назначить.
cvl
Сообщения: 25
Зарегистрирован: 2015.03.02, 08:42
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение cvl »

all
Неужели такая сложная задача?
P.S. Может быть, это просто не заложено в фреймворк?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение ElisDN »

Открываем PageCache, видим код:

Код: Выделить всё

$data = $this->cache->get($this->calculateCacheKey());
...
$this->cache->set($this->calculateCacheKey(), $data); 
Смотрим метод calculateCacheKey:

Код: Выделить всё

protected function calculateCacheKey()
{
    $key = [__CLASS__];
    if ($this->varyByRoute) {
        $key[] = Yii::$app->requestedRoute;
    }
    if (is_array($this->variations)) {
        foreach ($this->variations as $value) {
            $key[] = $value;
        }
    }
    return $key;
} 
Собираем такой же ключ и удаляем по нему:

Код: Выделить всё

Yii::$app->cache->delete([
    '\yii\filters\PageCache',
    'page/view',
]); 
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение rugabarbo »

ElisDN писал(а):Открываем PageCache, видим код:

Код: Выделить всё

$data = $this->cache->get($this->calculateCacheKey());
...
$this->cache->set($this->calculateCacheKey(), $data); 
Смотрим метод calculateCacheKey:

Код: Выделить всё

protected function calculateCacheKey()
{
    $key = [__CLASS__];
    if ($this->varyByRoute) {
        $key[] = Yii::$app->requestedRoute;
    }
    if (is_array($this->variations)) {
        foreach ($this->variations as $value) {
            $key[] = $value;
        }
    }
    return $key;
} 
Собираем такой же ключ и удаляем по нему:

Код: Выделить всё

Yii::$app->cache->delete([
    '\yii\filters\PageCache',
    'page/view',
]); 
Нужно полагаться на интерфейсы, а не на реализацию, потому что реализация может поменяться. Работать конечно будет, но мне бы очень плохо спалось после использования подобного подхода в своём проекте...
cvl
Сообщения: 25
Зарегистрирован: 2015.03.02, 08:42
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение cvl »

ElisDN
Большое спасибо! Не догадался заглянуть в исходники PageCache, а сделать это стоило в первую очередь.

rugabarbo
Вряд ли алгоритм calculateCacheKey поменяется, но для перестраховки его можно переопределить, введя потомок PageCache. Ничего страшного тут нет (ИМХО).
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение rugabarbo »

Переопределить - OK.
Полагаться на реализацию - bad practice.

(:
cvl
Сообщения: 25
Зарегистрирован: 2015.03.02, 08:42
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение cvl »

rugabarbo писал(а):Полагаться на реализацию - bad practice.
Согласен, это рискованное дело.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение ElisDN »

Ну если нужно по интерфейсу, то ввести тегирование с TagDependency и чистить по тегу.
die1990
Сообщения: 15
Зарегистрирован: 2021.12.21, 20:18

Re: Сброс отдельных страничек, закэшированных через PageCache

Сообщение die1990 »

как в behaviors задать имя кэшу? Он создается, вопросов нет, но он создается хэшем, а нужно имя, чтобы передать в админ контроллер для обновления кэша при обновлении данных, например когда создастся статья новая и т.д.

До behaviors использовал обычных кэш и обновление автоматически работало когда создавалась статья, категория и т.д, но с пагинацией он не дружит, а этот дружит

public function behaviors()
{
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 6000,
'variations' => [
[Yii::$app->request->get('page')],
],
],
];
}
Ответить