php-solution/app-cache-bundle

Symfony 扩展,用于将 Redis 作为应用程序的主要缓存。

v4.0.1 2018-01-17 10:28 UTC

This package is auto-updated.

Last update: 2024-09-14 17:59:04 UTC


README

此扩展允许开发者在 Symfony 应用程序中将 Redis 作为主要缓存提供程序使用。

更好的性能

  • Bundle composer.json 包含在 require 部分中包含 ext-redis,因为 phpredis 库 允许您在应用程序中使用 Redis 获得更好的性能。
  • 对于序列化,请安装并启用 php 扩展 igbinary

Redis 客户端

您可以在 Symfony DI 中指定 Redis 客户端作为服务。

默认情况下,新 DI 引用将通过工厂 \PhpSolution\Utils\ClientFactory::createRedisClient() 创建,并为 \Redis 设置正确的序列化选项。

配置示例

app_cache:
    redis_clients:
        general:
            public: false
            id: 'app_cache.redis_clients.general'
            class: 'Redis'
            dsn: 'redis://:6379/db_name'
            options: ~

在应用程序中

/* @var $client \Redis */
$client = $this->container->get('app_cache.redis_clients.general');
$client->set('key', 'value');
$string = $client->get('key'); // $string === 'value'

与 SymfonyFrameworkBundle 集成

缓存池

您可以使用 Redis 客户端服务作为 SF 缓存池提供程序

app_cache 扩展配置示例

app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/data_base_name'

FrameworkBundle 配置示例

framework:
    cache:
        pools:
            cache_pools.redis.general:
                public: false
                default_lifetime: 0
                adapter: 'cache.adapter.redis'
                provider: 'app_cache.redis_clients.general' # Redis client service id

缓存提供程序

SymfonyFrameworkBundle 允许您缓存

  • 验证映射缓存(在生产环境中使用 file_cache)
  • 序列化映射缓存(在生产环境中使用 file_cache)
  • 注解(您可以使用 php_array)
  • 模板(仅用于 PHP 模板引擎,更多信息
使用 Redis 进行验证映射缓存
app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/db_name'
    framework:
        validator:
            enabled: true
            client_id: 'app_cache.redis_clients.general'
            namespace: 'sf_validator'

framework:
    validation:
        enable_annotations: true
        cache: 'app_cache.framework.validator_mapping_cache'
使用 Redis 进行序列化映射缓存
app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/db_name'
    framework:
        serializer:
            enabled: true
            client_id: 'app_cache.redis_clients.general'
            namespace: 'sf_serializer'

framework:    
    validation:
        enable_annotations: true
        cache: 'app_cache.framework.validator_mapping_cache'

Swiftmailer 池

您可以将 Redis 作为存储 spool swiftmailer 消息的存储。

AppCacheBundle 配置

app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/data_base_name'
    swiftmailer:
        enabled: true            
        client_id: 'app_cache.redis_clients.general'

SwiftmailerBundle 配置

swiftmailer:
    spool:
        type: 'service'
        id: 'app_cache.cacheable.swiftmailer_spool'

您可以自定义池服务

app_cache:
    swiftmailer:
        enabled: true
        client_id: 'app_cache.redis_clients.general'
        cache_key: 'swiftmailer_spool'

会话处理器

您可以使用 Redis 作为会话存储。扩展包含 SessionHandle,在 DI 'app_cache.cacheable.session_handler' 中注入 \Redis 客户端并在 \Redis 上存储会话。

AppCacheBundle 配置示例

app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/db_name'
    session:
        enabled: true
        client_id: 'app_cache.redis_clients.general'

FrameworkBundle 配置示例

    framework:
        session:
            handler_id: 'app_cache.cacheable.session_handler'

您可以自定义会话处理器

app_cache:
    session:
        enabled: true
        client_id: 'app_cache.redis_clients.general'
        ttl: 86400
        cache_key: 'sfs_'

Doctrine 缓存提供程序

您可以将服务指定为 Doctrine 缓存提供程序。配置示例

app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/db_name'
    doctrine:
        providers:
            general:
                id: 'app_cache.doctrine_providers.redis'
                class: 'Doctrine\Common\Cache\RedisCache'
                client_id: 'app_cache.redis_clients.general'
                namespace: 'doctrine'

正确的 Doctrine 缓存驱动器配置

正确的 doctrine 配置

app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/db_name'
    doctrine:
        providers:
            general:
                id: 'app_cache.doctrine_providers.redis'
                client_id: 'app_cache.redis_clients.general'
                namespace: 'doctrine'            

parameters:
    doctrine_cache.metadata_cache_driver: {type: 'service', id: 'app_cache.doctrine_providers.redis'}
    doctrine_cache.query_cache_driver: {type: 'service', id: 'app_cache.doctrine_providers.redis'}
    doctrine_cache.result_cache_driver: {type: 'service', id: 'app_cache.doctrine_providers.redis'}
    doctrine_cache.slc_driver: {type: 'service', id: 'app_cache.doctrine_providers.redis'}

doctrine:        
    orm:
        entity_managers:
            default:
                metadata_cache_driver: '%doctrine_cache.metadata_cache_driver%'
                query_cache_driver: '%doctrine_cache.query_cache_driver%'
                result_cache_driver: '%doctrine_cache.result_cache_driver%'
                second_level_cache:
                    region_cache_driver: '%doctrine_cache.slc_driver%'
                    regions:
                        concurrent_entity_region:
                            type: 'filelock'
                            cache_driver: '%doctrine_cache.slc_driver%'
                        entity_region:
                             lifetime: 0
                             cache_driver: '%doctrine_cache.slc_driver%'

Doctrine 缓存驱动器配置(仅限基本使用!!!)

此扩展允许您指定以下缓存提供程序

  • metadata_cache
  • result_cache
  • query_cache
  • second_level_cache

此功能与 SncRedisBundle 类似,并自动分配 Doctrine 缓存提供程序,但仅使用缓存提供程序的别名,而不是创建单独的提供程序。

配置示例

app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            dsn: 'redis://:6379/db_name'        
    doctrine:
        providers:
            general:
                id: 'app_cache.doctrine_providers.redis'
                client_id: 'app_cache.redis_clients.general'
        cache:
            metadata_cache:
                provider_id: 'app_cache.doctrine_providers.redis'
                entity_managers: ['default']

扩展创建新的服务别名(模式名称:doctrine.orm.%s_%s),并将其用作缓存驱动器。

例如 doctrine.orm.default_metadata_cache - default 实体管理器的 metadata_cache 的服务名称。

仅为此功能的基本配置使用此功能,因为

  • 您不能重写环境缓存驱动程序的参数
  • 您不能指定 second_level_cache 区域参数
  • 此扩展必须在 AppKernel 中指定在 DoctrineBundle 之后

Twig 缓存

Twig 使用 Filesystem 缓存作为模板缓存的提供程序。您必须使用 Filesystem 缓存(不是 Redis 和其他提供程序),并且为了最佳性能,请配置 PHP opcache。

关于链接上Twig缓存的附加信息

完整默认配置

app_cache:
    redis_clients:
        general:
            id: 'app_cache.redis_clients.general'
            class: 'Redis'
            dsn: 'redis://:6379/db_name'
            options: ~
    framework:
        validator:
            enabled: true
            client_id: 'app_cache.redis_clients.general'
            namespace: 'sf_validator'
        serializer:
            enabled: true
            client_id: 'app_cache.redis_clients.general'
            namespace: 'sf_serializer'
    swiftmailer:
        enabled: true
        client_id: 'app_cache.redis_clients.general'
        cache_key: 'swiftmailer_spool'
    session:
        enabled: true
        client_id: 'app_cache.redis_clients.general'
        ttl: 86400
        cache_key: 'sfs_'
    doctrine:
        providers:
            general:
                id: 'app_cache.doctrine_providers.redis'
                class: 'Doctrine\Common\Cache\RedisCache'
                client_id: 'app_cache.redis_clients.general'
                namespace: 'doctrine'
        cache:
            metadata_cache:
                provider_id: 'app_cache.doctrine_providers.redis'
                entity_managers: ['default']
                document_managers: ['default']
            result_cache:
                provider_id: 'app_cache.doctrine_providers.redis'
                entity_managers: ['default']
                document_managers: ['default']
            query_cache:
                provider_id: 'app_cache.doctrine_providers.redis'
                entity_managers: ['default']
                document_managers: ['default']
            second_level_cache:
                provider_id: 'app_cache.doctrine_providers.redis'
                entity_managers: ['default']
                document_managers: ['default']

与非生产环境协同工作

测试环境

测试环境必须与生产环境相同。因此,对于测试环境,建议在启动测试用例之前清理缓存。

使用监听器清理缓存。以下为 phpunit.xml 的示例

<phpunit>

    ...
    
    <listeners>
    
        ...
        
        <listener class="PhpSolution\FunctionalTest\PHPUnit\Listener\CommandLauncher">
            <arguments>
                <string>doctrine:cache:clear-metadata</string>
                <array>
                    <element key="--flush">
                        <null/>
                    </element>
                </array>
            </arguments>
        </listener>
        <listener class="PhpSolution\FunctionalTest\PHPUnit\Listener\CommandLauncher">
            <arguments>
                <string>doctrine:cache:clear-query</string>
                <array>
                    <element key="--flush">
                        <null/>
                    </element>
                </array>
            </arguments>
        </listener>
        <listener class="PhpSolution\FunctionalTest\PHPUnit\Listener\CommandLauncher">
            <arguments>
                <string>doctrine:cache:clear-result</string>
                <array>
                    <element key="--flush">
                        <null/>
                    </element>
                </array>
            </arguments>
        </listener>
        
        ...
        
    </listeners>
</phpunit>

开发环境

对于开发环境,不建议使用缓存