Symfony RedisAdapter имеет разные ключи внутреннего кэша в зависимости от среды приложения

#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. Спасибо! Тогда я определю сервисы!