缓存

编辑该页面

缓存

使用缓存是一个伟大的方式,使您的应用程序运行更快。Symfob娱乐下载ony缓存组件附带许多不同存储适配器。每个适配器都是开发高性能。

下面的示例显示了一个典型的缓存的使用:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\合同\缓存\ItemInterface;/ /调用缓存错过才会被执行。美元价值=美元- >get (“my_cache_key”,函数(ItemInterface美元){美元- >expiresAfter (3600年);/ /……做一些HTTP请求或重计算吗美元computedValue=“foobar”;返回美元computedValue;});回声美元价值;/ /“foobar”/ /……并删除缓存键美元- >删除(“my_cache_key”);

ob娱乐下载Symfony支持缓存合同和PSR-6/16接口。你可以阅读更多关于这些的组件的文档欧宝官网下载app

配置缓存与FrameworkBundle

当配置缓存组件有几个概念的你应该知道:

这是一个服务,你会相互作用。每个池总有其自己的名称空间和缓存条目。没有池之间的冲突。
适配器
适配器是一种模板你使用它来创建池。
提供者
提供者是服务,一些适配器使用连接到存储。复述和Memcached实例的适配器。如果一个DSN作为供应商则自动创建一个服务。

有两个泳池,总是默认启用。他们是cache.appcache.system。系统缓存用于注释,序列化器和验证。的cache.app可以在代码中使用。您可以配置的适配器(模板)他们使用使用应用程序系统关键:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ cache.yaml框架:缓存:应用:cache.adapter.filesystem系统:cache.adapter.system

提示

虽然有可能重新配置系统缓存,建议保持默认配置应用于Symfony。ob娱乐下载

缓存组件提供了一系列的适配器配置:

这些适配器通过快捷键可以配置。使用这些快捷键将创建池与服务id遵循的模式(类型)缓存。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ cache.yaml框架:缓存:目录:“% kernel.cache_dir % /池”#只有cache.adapter.filesystem使用#服务:cache.psr6default_psr6_provider:“app.my_psr6_service”#服务:cache.redisdefault_redis_provider:复述:/ / localhost的#服务:cache.memcacheddefault_memcached_provider:memcached: / / localhost的#服务:cache.pdodefault_pdo_provider:“doctrine.dbal.default_connection”

创建自定义(名称空间)

您还可以创建更多的定制池:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31
#配置/包/ cache.yaml框架:缓存:default_memcached_provider:memcached: / / localhost的池:#创建一个“custom_thing。缓存”服务# autowireable通过“CacheInterface customThingCache美元”#使用“应用程序”的缓存配置custom_thing.cache:适配器:cache.app#创建一个“my_cache_pool”服务# autowireable通过“CacheInterface myCachePool美元”my_cache_pool:适配器:cache.adapter.filesystem#使用default_memcached_provider从上面acme.cache:适配器:cache.adapter.memcached#控制适配器的配置foobar.cache:适配器:cache.adapter.memcached供应商:“memcached: / /用户:password@example.com”#使用“foobar。缓存" pool as its backend but controls< /span>#一生和(像所有池)有一个单独的缓存名称空间short_cache:适配器:foobar.cachedefault_lifetime:60

每个池管理一组独立的缓存键:钥匙从不同的池从来没有碰撞,即使他们共享相同的后端。这是通过与一个名称空间前缀键生成的散列的名称,缓存的名称和适配器类可配置的种子默认为项目目录和编译的容器类。

每个自定义池成为服务的服务ID是池的名称(如。custom_thing.cache)。还为每个池创建一个自动装配别名使用驼峰式大小写版本的名称——如。custom_thing.cache可以自动注入命名的论点吗customThingCache美元并类型提示CacheInterfacePsr \ \ CacheItemPoolInterface缓存:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\合同\缓存\CacheInterface;/ /从一个控制器的方法公共函数listProducts(CacheInterface美元customThingCache){/ /……}/ /服务公共函数__construct(CacheInterface美元customThingCache){/ /……}

提示

如果你需要名称空间与第三方可互操作的应用程序,你可以通过设置控制自动生成名称空间的属性cache.pool服务标签。例如,您可以重写服务适配器的定义:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……app.cache.adapter.redis:家长:“cache.adapter.redis”标签:- - - - - -{名称:“cache.pool”,名称空间:“my_custom_namespace”}

自定义服务提供方程序选项

一些供应商特定的选项,这些选项可以配置。的RedisAdapter允许您创建供应商的选择超时,retry_interval。等。使用这些选项你需要创建自己的非默认值\复述,提供者和使用,当配置池。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#配置/包/ cache.yaml框架:缓存:池:cache.my_redis:适配器:cache.adapter.redis供应商:app.my_custom_redis_provider服务:app.my_custom_redis_provider:类:\复述,工厂:\ ob娱乐下载[' Symfony \缓存组件\ \适配器RedisAdapter”,“createConnection”]参数:- - - - - -复述:/ / localhost的- - - - - -{retry_interval:2,超时:10}

创建一个缓存链

不同的缓存适配器有不同的优点和缺点。一些可能很快,但优化储存小物品和一些可能会包含大量的数据,但非常缓慢。得到最好的两个世界你可以用一连串的适配器。

缓存链结合几种缓存池成一个服务。当将一个条目存储在缓存链,Symfony将其存储在所有池顺序。ob娱乐下载当检索项,Symfony试图把它从第一个池。ob娱乐下载如果没有找到,它尝试下一个池,直到找到项目或抛出异常。因为这种行为,建议定义链中的适配器从最快到最慢。

如果一个错误发生在存储池中的一个条目,Symfony将其存储在另一个池,没有异常。ob娱乐下载稍后,当检索项,Symfony项目自动存储在所有失踪的池。ob娱乐下载

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ cache.yaml框架:缓存:池:my_cache_pool:default_lifetime:31536000#一年适配器:- - - - - -cache.adapter.array- - - - - -cache.adapter.apcu- - - - - -{名称:cache.adapter.redis,供应商:“复述:/ /用户:password@example.com”}

使用缓存的标签

与许多应用程序缓存键可能是有用的组织存储的数据能够更有效地缓存失效。实现这一点的方法之一是使用缓存标签。一个或多个标签可以被添加到缓存项。所有项目的关键可能失效一个函数调用:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31
使用ob娱乐下载\合同\缓存\ItemInterface;使用ob娱乐下载\合同\缓存\TagAwareCacheInterface;SomeClass{私人美元myCachePool;/ /使用自动装配注入缓存池公共函数__construct(TagAwareCacheInterface美元myCachePool){美元- >myCachePool =美元myCachePool;}公共函数someMethod(){美元value0=美元- >myCachePool- >get (“item_0”,函数(ItemInterface美元){美元- >标签([“foo”,“酒吧”]);返回“调试”;});美元value1=美元- >myCachePool- >get (“item_1”,函数(ItemInterface美元){美元- >标记(“foo”);返回“调试”;});/ /清除所有缓存键标记“酒吧”美元- >myCachePool- >invalidateTags ([“酒吧”]);}}

缓存适配器需要实现TagAwareCacheInterface启用这个特性。这可以通过使用以下配置。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/包/ cache.yaml框架:缓存:池:my_cache_pool:适配器:cache.adapter.redis标签:真正的

标签是默认存储在相同的池。这是一个在大多数场景。但有时它可能是更好的存储标签在不同的池。可以通过指定适配器。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
#配置/包/ cache.yaml框架:缓存:池:my_cache_pool:适配器:cache.adapter.redis标签:tag_pooltag_pool:适配器:cache.adapter.apcu

请注意

的接口TagAwareCacheInterface是autowired的cache.app服务。

清除缓存

您可以使用清除缓存bin /控制台缓存池:明确(池)命令。将删除所有的条目存储和你将不得不重新计算所有值。你也可以组织你的池“缓存清算所”。有三个默认缓存清算所:

  • cache.global_clearer
  • cache.system_clearer
  • cache.app_clearer

全球清晰每个池清除所有缓存项。系统中使用缓存更清晰bin /控制台缓存:清楚命令。应用程序更清晰是默认的清晰。

看到所有可用的缓存池:

1
美元php bin /控制台缓存池:列表

明确一个池:

1
美元php bin /控制台缓存池:my_cache_pool清晰

清除所有自定义池:

1
美元php bin /控制台缓存池:cache.app_clearer清晰

清除所有缓存无处不在:

1
美元php bin /控制台缓存池:cache.global_clearer清晰

加密的缓存

加密缓存使用libsodium,你可以使用SodiumMarshaller

首先,您需要生成一个安全的密钥,并将它添加到您的秘密商店作为CACHE_DECRYPTION_KEY:

1
美元php - r“回声base64_encode (sodium_crypto_box_keypair ());”

然后,注册SodiumMarshaller服务使用这个键:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ cache.yaml#……服务:ob娱乐下载Symfony \缓存组件\ \ Marshaller \ SodiumMarshaller:装饰:cache.default_marshaller参数:- - - - - -[' % env (base64: CACHE_DECRYPTION_KEY) % ')#使用多个键以旋转它们# - - - - - - [' % env (base64: CACHE_DECRYPTION_KEY) % ', ' % env (base64: OLD_CACHE_DECRYPTION_KEY) % ')- - - - - -“@ob娱乐下载Symfony \缓存组件\ \ Marshaller \ SodiumMarshaller.inner”

谨慎

这将加密缓存项的值,而不是缓存键。小心不要泄漏敏感数据的键。

当配置多个键,第一个键将用于阅读和写作,和额外的关键(s)将只用于阅读。一旦所有缓存项用旧的加密键已经过期,您可以完全删除OLD_CACHE_DECRYPTION_KEY

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
ob娱乐下载Symfony 6.0支持通过SensioLabs