Кэширование, не срабатывает DbDependency

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кэширование, не срабатывает DbDependency

Сообщение drag0n » 2018.09.13, 06:19

urichalex писал(а):
2018.09.12, 23:07
А вы уверены, что updated_at обновляется?
Уверен. Я его в ручную обновляю.

drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кэширование, не срабатывает DbDependency

Сообщение drag0n » 2018.09.13, 06:26

andku83 писал(а):
2018.09.13, 01:13
drag0n писал(а):
2018.09.12, 20:33
... т.е. происходили изменения в таблице.
Кеш никак не производит изменений в таблице (ну разве что если вы кешируете в БД, а не в файлы (по-умолчанию))
drag0n писал(а):
2018.09.12, 20:33
при изменении поля updated_at, сбрасывался кэш...
Dependency не вызывает удаления кеша, а всего лишь говорит о том можно ли его использовать как валидный или же нужно получать данные заново.
Наверное правильней мне было сказать, устанавливаю зависимость кеша на изменение даты в поле updated_at.
Я уже столько статей перечитал и видео смотрел в основном этот пример,

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

        $db = User::getDb();
        $dep = new dbDependency();
        $dep->sql = "SELECT MAX(updated_at) FROM user";
        $result = $db->cache(function ($db) {
            return User::find()->all($db);
        }, 600, $dep)
почему он везде работает, а у меня нет?

Loveorigami
Сообщения: 818
Зарегистрирован: 2014.08.27, 21:54

Re: Кэширование, не срабатывает DbDependency

Сообщение Loveorigami » 2018.09.13, 10:46

Дебажьте построчно в своем примере.

1. Сделайте без Dependency - кеш работает?
2. Что такое User::getDb()?

почему не как в документации для начала, чтоб удостоверится? https://yii2-framework.readthedocs.io/e ... hing-data/
Кэширование запросов требует [[yii\db\Connection|DB connection]] и приложения действительный cache. Простое использование запросов кэширования происходит следующим образом, предпологая что $db это экземпляр [[yii\db\Connection]]:

$result = $db->cache(function ($db) {

// Результат SQL запроса будет возвращен из кэша если
// кэширование запросов включено и результат запроса присутствует в кэше
return $db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne();

});
3. Внимательно еще раз прочитайте доку. https://yii2-framework.readthedocs.io/e ... hing-data/
Есть там и такое
Ограничения
Кэширование запросов не работает с результатами запросов, которые содержат обработчики ресурсов. Например, при использовании типа столбца BLOB в некоторых СУБД, в качестве результата запроса будет выведен ресурс обработчик данных столбца.

Некоторые кэш хранилища имеют ограничение в размере данных. Например, Memcache ограничивает максимальный размер каждой записи до 1 Мб. Таким образом, если результат запроса превышает этот предел, данные не будут закешированы.
Ваш return User::find()->all($db); как бы намекает на это...

drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кэширование, не срабатывает DbDependency

Сообщение drag0n » 2018.09.13, 14:06

Кеш у меня работает, я писал об этом.

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

        $db = Yii::$app->db;
        $result = $db->cache(function ($db) {
            return $db->createCommand('SELECT * FROM userlist WHERE id=1')->queryOne();
        });
Этот код кэшируется нормально.

Данные все выводятся нормально из кэша, в отладчике Yii нет записи с БД, т.е. кэш работает нормально.
Но вот когда я изменяю поле updated_at, все так же выводится из кэша, не выводятся измененные данные.
http://nimb.ws/21XJzb

BLOB и TEXT я не использую.

Loveorigami
Сообщения: 818
Зарегистрирован: 2014.08.27, 21:54

Re: Кэширование, не срабатывает DbDependency

Сообщение Loveorigami » 2018.09.14, 15:06

Перепроверьте

тут одно

$dep->sql = "SELECT MAX(updated_at) FROM user";

тут другое

return $db->createCommand('SELECT * FROM userlist WHERE id=1')->queryOne();

В какой таблице updated_at вы меняете?

drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кэширование, не срабатывает DbDependency

Сообщение drag0n » 2018.09.14, 18:23

я пользуюсь таблицей userlist

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

    public function actionListUser()
    {
        $db = Yii::$app->db;
        $result = $db->cache(function ($db) {
            return $db->createCommand('SELECT * FROM userlist WHERE id=1')->queryOne();
        });

        return $this->render('list-user', ['users' => $result]);
    }
все перепроверил, все тоже не изменяются данные при изменении updated_at

andku83
Сообщения: 727
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Кэширование, не срабатывает DbDependency

Сообщение andku83 » 2018.09.14, 18:57

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

        $db = User::getDb();
        $dep = new DbDependency();
        $dep->sql = "SELECT MAX(updated_at) FROM user";

        $db = Yii::$app->db;
        $result = $db->cache(function ($db) {
            return $db->createCommand('SELECT * FROM user WHERE id=2')->queryOne();
        }, 60, $dep);
у меня в env prod вот так все работает...

drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кэширование, не срабатывает DbDependency

Сообщение drag0n » 2018.09.14, 19:22

У меня и ваш и мой вариант работает

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

        $dep = new DbDependency();
        $dep->sql = "SELECT MAX(updated_at) FROM userlist";

        $db = Yii::$app->db;
        $result = $db->cache(function ($db) {
            return Userlist::find()->where('id = 2')->one(); 
        }, 180, $dep);
Но это работает только с одной записью one(),
а мне надо all() - по всей таблице

andku83
Сообщения: 727
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Кэширование, не срабатывает DbDependency

Сообщение andku83 » 2018.09.14, 19:55

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

        $dep = new dbDependency();
        $dep->sql = "SELECT MAX(updated_at) FROM user";

        $db = Yii::$app->db;
        $result = $db->cache(function () {
            return User::find()->all();
        }, 60, $dep);
и так у меня тоже все работает.

drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кэширование, не срабатывает DbDependency

Сообщение drag0n » 2018.09.14, 20:17

А у меня этот вариант не работает, вот с этим я задолбался

Loveorigami
Сообщения: 818
Зарегистрирован: 2014.08.27, 21:54

Re: Кэширование, не срабатывает DbDependency

Сообщение Loveorigami » 2018.09.14, 20:52

Вы выше до конца прочитали???
Некоторые кэш хранилища имеют ограничение в размере данных. Например, Memcache ограничивает максимальный размер каждой записи до 1 Мб. Таким образом, если результат запроса превышает этот предел, данные не будут закешированы.

Ваш return User::find()->all($db); как бы намекает на это...
Попробуйте User::find()->limit(2)->all($db);

drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кэширование, не срабатывает DbDependency

Сообщение drag0n » 2018.09.14, 21:22

Да читал.
Я использую

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

'cache' => [
            'class' => 'yii\caching\FileCache',
И у меня все кэшируется, я уже который раз говорю кэш работает нормально,
мне нужно чтобы, если я изменяю updated_at, то изменения показывались на экране,
этого не происходит, показывается только кэш.
DbDependency при one() работает, если all() не работает.

Ответить