php-solution / app-cache-bundle
Symfony 扩展,用于将 Redis 作为应用程序的主要缓存。
Requires
- php: >=7.1
- ext-redis: >=3.0
- doctrine/cache: >=1.0
- symfony/config: >=3.3
- symfony/dependency-injection: >=3.3
- symfony/framework-bundle: >=3.3
- symfony/http-kernel: >=3.3
Requires (Dev)
- symfony/swiftmailer-bundle: >=3.1
- symfony/validator: >=4.0
Suggests
- ext-igbinary: for better performance
- symfony/swiftmailer-bundle: >=2.0
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>
开发环境
对于开发环境,不建议使用缓存