#symfony #redis #symfony4
#symfony #redis #symfony4
Вопрос:
Я использую кэш redis в своем приложении symfony.
При проверке внутренне используемых ключей в redis-cli
я обнаружил, что все записи имеют общий префикс (например, AWVAugkC6-:
, или gBphwvED1G:
). Префикс меняется, если я переключаюсь APP_ENV
между dev
и prod
.
Могу ли я отключить это поведение?
В настоящее время я не могу использовать записи prod в режиме разработки, и наоборот.
Вызов
$this->cache->getItem('2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-noref-nostr');
преобразуется в режиме разработки в ключ redis
gBphwvED1G:2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-noref-nostr
однако в prod это
AWVAugkC6-:2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-noref-nostr
Итак, префикс заменен!
Я проследил это до AbstractTrait::getId($key)
https://github.com/symfony/cache/blob/e5e9a6d35558b43cca49cde9f3a7ad22980812cb/Traits/AbstractTrait.php#L269 , но я думаю, что эта строка должна просто хэшировать ключ give, а не среду …?
framework:
cache:
default_redis_provider: 'redis://%env(REDIS_HOST)%'
pools:
data_evaluator_cache_items_cache:
adapter: cache.adapter.redis
default_lifetime: 0
public: true
data_evaluator_cache_tags_cache:
adapter: cache.adapter.redis
default_lifetime: 0
public: true
services:
tagged_data_cache:
class: SymfonyComponentCacheAdapterTagAwareAdapter
arguments:
$itemsPool: "@data_evaluator_cache_items_cache"
$tagsPool: "@data_evaluator_cache_tags_cache"
public: true
Я не уверен, относится ли это к адаптеру TagAwareAdapter. На самом деле хранится дополнительная запись тега, которая
Ответ №1:
Префикс вычисляется для обеспечения того, чтобы разработчики и prod не использовали одни и те же кэшированные элементы, в целях безопасности по умолчанию. Это делается при использовании семантической конфигурации, на этапе компиляции, здесь:
https://github.com/symfony/cache/blob/master/DependencyInjection/CachePoolPass.php#L55
Если вы хотите отказаться от этого, вам может потребоваться определить свои пулы кэша напрямую как сервис — без использования семантической конфигурации. Тогда у вас будет полный контроль над пространством имен и всем остальным.
Вы также можете продолжать использовать semantic и переопределить параметр kernel.container_class. Я думаю, это можно сделать, переопределив getContainerClass в вашем ядре.
Но сначала вы должны дважды проверить, почему вам нужно одно и то же пространство имен для prod и dev.
Комментарии:
1. Спасибо! Тогда я определю сервисы!