CakePHP 3.5.13
В методе Controller я кеширую запрос к базе данных следующим образом:
$substances = TableRegistry::get('Substances');
$query = $substances->find()->limit($limit)->offset($offset);
$query->cache(function ($query) {
return 'substance_results_' . md5(serialize($query->sql()));
});
$this->set('data', $query->all());
Это создает кешированный файл (мы используем Redis для кеширования вэто приложение), содержащее результаты запроса.Например, я вижу следующее в Redis:
127.0.0.1:6379> keys *
3) "cake_redis_substance_results_cb799f6526c148d133ad9ce9245b23be"
4) "cake_redis_substance_results_dbc7b0b99dff3ab6a20cbdfbbd09be8c"
Если тот же запрос ($query
) будет выполнен снова, Cake прочитает содержимое соответствующего кэшированного файла. Как это возможно, учитывая, что мы не сообщаем ему, с какого ключа читать кэшированные данные? Мы сообщаем ему имя ключа для записи в , но не читать из .
Чтобы проиллюстрировать это, скажем, я сделал:
$query->cache(function ($query) {
return 'foo_' . md5(serialize(time()));
});
Здесь я сделал ключ, который совершенно другой и не основывается на SQLказнены.Никакая часть кода не сообщает ему, какой ключ соответствует какому запросу.
Документация (https://book.cakephp.org/3.0/en/orm/query-builder.html#caching-loaded-results) по кэшированию загруженных результатов не объясняет это в отношении ORM. Она говорит:
Метод кэширования упрощает добавление кэшированных результатов в пользовательские искатели или через прослушиватели событий.
Когда результаты для кэшированного запроса fetched ...
Он говорит вам, как записать (добавить) в кеш, но не прочитать (извлечь) из него относительно ORM.
Я прочиталразделы документации, в которых рассказывается о том, как читать из кэша обычным, не зависящим от ORM способом (используя Cache::read($key)
), но это совершенно отдельно от того, чтобы ORM делал это автоматически. В случае Cache::read($key)
you 'мне нужно предоставить ключ ($key
), который сообщает ему, из какого файла кэша нужно прочитать данные - я могу понять это, поскольку вы явно указываете, какой ключ читать. Но это не относится к ORM и объектам запросов..
Пожалуйста, кто-нибудь может уточнить это?