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

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

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

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

Добавлено: 2018.09.13, 06:26
drag0n
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)
почему он везде работает, а у меня нет?

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

Добавлено: 2018.09.13, 10:46
Loveorigami
Дебажьте построчно в своем примере.

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); как бы намекает на это...

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

Добавлено: 2018.09.13, 14:06
drag0n
Кеш у меня работает, я писал об этом.

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

        $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 я не использую.

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

Добавлено: 2018.09.14, 15:06
Loveorigami
Перепроверьте

тут одно

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

тут другое

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

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

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

Добавлено: 2018.09.14, 18:23
drag0n
я пользуюсь таблицей 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

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

Добавлено: 2018.09.14, 18:57
andku83

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

        $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 вот так все работает...

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

Добавлено: 2018.09.14, 19:22
drag0n
У меня и ваш и мой вариант работает

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

        $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() - по всей таблице

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

Добавлено: 2018.09.14, 19:55
andku83

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

        $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);
и так у меня тоже все работает.

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

Добавлено: 2018.09.14, 20:17
drag0n
А у меня этот вариант не работает, вот с этим я задолбался

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

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

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

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

Добавлено: 2018.09.14, 21:22
drag0n
Да читал.
Я использую

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

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