Страница 1 из 1

Кэширование

Добавлено: 2014.11.28, 08:20
diselop
Имеем кэшированный запрос как по мануалу.
http://www.yiiframework.com/doc-2.0/gui ... ry-caching

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

$result = $db->cache(function ($db) {
    return $db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne();
});
Интерусуют 2 вопроса
1. Есть запрос добавление записи( выполняется 1-2 раза в месяц), и при этом запросе нужно обновить кэш.
2. Возможно ли в функцию передать какие-либо параметры?

Re: Кэширование

Добавлено: 2014.11.28, 09:59
kawabanga
Я для себя проблему с запросами решил кэшированием mysql)

Re: Кэширование

Добавлено: 2014.11.28, 10:57
astronin
прочтите всю документацию по кешированию, там есть ответы на оба вопроса

Re: Кэширование

Добавлено: 2014.11.28, 11:19
diselop
astronin писал(а):прочтите всю документацию по кешированию, там есть ответы на оба вопроса
А можно ссылку, а то вроде все перечитывал :D

Re: Кэширование

Добавлено: 2014.11.28, 11:44
yiijeka
1. Добавить DbDependency с

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

'sql' => 'SELECT updated_at FROM customer WHERE id=1 ' 
или подобным. Но кэшерованный запрос должен быть намного тормознутее Dependency запроса. А то смысл теряется.
2. Можно - это обычный php:

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

function ($db) use ($yourParam) { 
return $db->createCommand('SELECT * FROM customer WHERE id=' . $yourParam)->queryOne();
}

Re: Кэширование

Добавлено: 2014.11.28, 11:55
diselop
yiijeka писал(а):1. Добавить DbDependency с

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

'sql' => 'SELECT updated_at FROM customer WHERE id=1 ' 
или подобным. Но кэшерованный запрос должен быть намного тормознутее Dependency запроса. А то смысл теряется.
2. Можно - это обычный php:

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

function ($db) use ($yourParam) { 
return $db->createCommand('SELECT * FROM customer WHERE id=' . $yourParam)->queryOne();
}

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

use ($yourParam)
Спасибо, то что нужно.
по поводу Dependency я знаю, просто кэш обновляется очень очень редко, раз в месяц где-то.

Re: Кэширование

Добавлено: 2014.12.02, 07:47
diselop
Подскажите если так кэшировать запрос

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

$result = $db->cache(function ($db) {
    return $db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne();
});
 
и он будет вызываться из разных мест, то кэш будет одил или их несколько создастся?

Re: Кэширование

Добавлено: 2014.12.02, 08:01
yiijeka
Один

Re: Кэширование

Добавлено: 2014.12.02, 15:58
eresik
С кэшированием конечно в yii2 наворотили...
Я бы изменил подход к кэшированию пока не поздно.
Реально ведь жутко неудобно как сейчас - с анонимной функцией.

Re: Кэширование

Добавлено: 2014.12.02, 16:05
yiijeka
оО Пулл реквест никто не мешает отправить :)

Re: Кэширование

Добавлено: 2014.12.02, 16:14
eresik
Да как раз после моей "issue" переделали кэширование.
https://github.com/yiisoft/yii2/issues/3611

Не ожидал только что сделают так неудобно.
Там в комментариях был весьма неплохой подход предложен https://github.com/yiisoft/yii2/issues/ ... t-44406720

Re: Кэширование

Добавлено: 2014.12.02, 16:25
dmeroff
Можно поинтересоваться, а чем неудобно кеширование с использованием анонимной функции?
По поводу "пока не поздно", по-моему уже как раз поздно, ведь был уже стабильный релиз, поэтому теперь ломать обратную совместимость никто не будет.

Re: Кэширование

Добавлено: 2014.12.02, 16:27
zelenin
eresik писал(а):С кэшированием конечно в yii2 наворотили...
Я бы изменил подход к кэшированию пока не поздно.
Реально ведь жутко неудобно как сейчас - с анонимной функцией.
документацию прочли? есть разные варианты.

Re: Кэширование

Добавлено: 2014.12.02, 16:30
yiijeka
Почему вас не устраивает анонимная функция - пример пожалуйста в студию!

Re: Кэширование

Добавлено: 2014.12.02, 16:37
eresik
Допустим надо кэшировать простой реляционный запрос
$country->states;

который где-нибудь во view выполняется

И что, городить огород во view с анонимной функцией?
$states=\Yii::$app->db->cache(function() use ($country){ return $country->states; });
Это же выглядит ужасно, сходу непонятно, и просто засоряет код.

Конечно, можно сделать жадную загрузку ещё в контроллере, но её же не всегда можно сделать удобно, да и не всегда она нужна.

Re: Кэширование

Добавлено: 2014.12.02, 16:38
eresik
zelenin писал(а):документацию прочли? есть разные варианты.
Хоть убей, разных вариантов я там не вижу.
Кроме как вариант - напрямую работать с кэшем.

Re: Кэширование

Добавлено: 2014.12.02, 16:39
zelenin
eresik писал(а):Допустим надо кэшировать простой реляционный запрос
$country->states;

который где-нибудь во view выполняется

И что, городить огород во view с анонимной функцией?
$states=\Yii::$app->db->cache(function() use ($country){ return $country->states; });
Это же выглядит ужасно, сходу непонятно, и просто засоряет код.

Конечно, можно сделать жадную загрузку ещё в контроллере, но её же не всегда можно сделать удобно, да и не всегда она нужна.
еще раз, доки почитайте

Re: Кэширование

Добавлено: 2014.12.02, 16:41
zelenin
eresik писал(а): Конечно, можно сделать жадную загрузку ещё в контроллере, но её же не всегда можно сделать удобно, да и не всегда она нужна.
Yii::$app->cache->get - если вы это называет прямым доступом к кэшу, то пусть так. Это решает вашу. проблему. Внесите в модель метод с таким кэшированием и все.