缓存池和支持的适配器
编辑该页面缓存池和支持的适配器
缓存池的逻辑存储库缓存项。他们在项目执行所有常见的操作,例如保存或寻找它们。缓存池是独立于实际的缓存实现。因此,应用程序可以继续使用相同的缓存池即使底层的缓存机制的变化从一个基于文件系统缓存复述或数据库缓存。
创建缓存池
通过创建缓存池缓存适配器类,实现两种CacheInterface和Psr \ \ CacheItemPoolInterface缓存
。此组件提供了几个适配器可以使用在你的应用程序。
使用缓存的合同
的CacheInterface允许获取、存储和删除缓存项只使用两个和一个回调方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;使用ob娱乐下载\合同\缓存\ItemInterface;美元缓存=新FilesystemAdapter ();/ /调用缓存错过才会被执行。美元价值=美元缓存- >get (“my_cache_key”,函数(ItemInterface美元项):字符串{美元项- >expiresAfter (3600年);/ /……做一些HTTP请求或重计算吗美元computedValue=“foobar”;返回美元computedValue;});回声美元价值;/ /“foobar”/ /……并删除缓存键美元缓存- >删除(“my_cache_key”);
开箱即用的,使用这个接口提供了踩踏事件通过锁定和保护早期失效。早期到期可以控制通过的第三个“测试版”的论点get ()方法。看到缓存组件文章以获取更多信息。
早期到期可以检测到内部调用的回调isHit ()方法:如果这个回报真正的
,这意味着我们正在超过保质期再计算一个值。
高级用例,回调可以接受bool &美元拯救
论证以引用的方式传递。通过设置美元拯救
来假
在回调,您可以指示缓存池的返回值不应该后端存储。
使用PSR-6
寻找缓存条目
缓存池定义三种方法寻找缓存项。最常见的方法getItem(键)
,它返回缓存条目被给定的关键:
1 2 3 4
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;美元缓存=新FilesystemAdapter (“app.cache”);美元latest欧宝平台是合法的吗News=美元缓存- >getItem (“latest_欧宝平台是合法的吗news”);
对于给定的键,如果没有定义项的方法不会返回零
但一个空对象,实现了价值CacheItem类。
如果你需要同时获取多个缓存条目,而不是使用getItems ([$ key1 key2美元…])
方法:
1 2
/ /……美元股票=美元缓存- >getItems ([“apple”,“facebook”,“GOOGL”,“微软”]);
再一次,如果任何键并不代表一个有效的缓存项,你不会得到一个零
但一个空值CacheItem
对象。
最后一个方法相关抓取缓存项hasItem(键)
,它返回真正的
如果有一个缓存项被给定的关键:
1 2
/ /……美元hasBadges=美元缓存- >hasItem (“user_”。美元用户标识。“_badges”);
保存缓存条目
最常见的方法保存缓存条目Psr \缓存\ CacheItemPoolInterface::保存
在缓存中存储项立即(它返回真正的
如果项目或保存假
如果有错误发生):
1 2 3 4
/ /……美元userFriends=美元缓存- >getItem (“user_”。美元用户标识。“_friends”);美元userFriends- >集(美元用户- >getFriends ());美元isSaved=美元缓存- >保存(美元userFriends);
有时你可能更喜欢不立即保存对象,以提高应用程序的性能。在这种情况下,使用Psr \缓存\ CacheItemPoolInterface:: saveDeferred
方法将缓存条目标记为“准备坚持“然后调用Psr \缓存\ CacheItemPoolInterface:提交
方法当你准备坚持:
1 2 3 4 5 6 7 8
/ /……美元isQueued=美元缓存- >saveDeferred (美元userFriends);/ /……美元isQueued=美元缓存- >saveDeferred (美元userPreferences);/ /……美元isQueued=美元缓存- >saveDeferred (美元userRecentProducts);/ /……美元isSaved=美元缓存- >commit ();
的saveDeferred ()
方法返回真正的
当缓存项已成功添加到“坚持队列”和假
否则。的commit ()
方法返回真正的
当所有的等待成功保存或物品假
否则。
删除缓存项
缓存池包括删除缓存项的方法,其中一些或全部。最常见的是Psr \缓存\ CacheItemPoolInterface:: deleteItem
删除缓存项,通过给定的键标识(它返回真正的
当项目成功删除或不存在假
否则):
1 2
/ /……美元isDeleted=美元缓存- >deleteItem (“user_”。美元用户标识);
使用Psr \缓存\ CacheItemPoolInterface:: deleteItems
方法同时删除多个缓存条目(它返回真正的
只有当所有的商品都被删除,即使不存在任何或其中一些):
1 2
/ /……美元areDeleted=美元缓存- >deleteItems ([“category1”,“category2”]);
最后,清除所有缓存条目中存储池,使用Psr \缓存\ CacheItemPoolInterface:清楚
方法(返回真正的
当所有项目成功删除):
1 2
/ /……美元cacheIsEmpty=美元缓存- >明确的();
提示
如果缓存组件内部使用Symfony应用程序中,您可以使用以下命令把物品从缓存池(ob娱乐下载驻留在框架包):
删除一个特定的项目从鉴于池:
1 2 3 4
美元php bin /控制台缓存池:删除< cache-pool-name > < cache-key-name >#删除项从“cache_key缓存。应用程序池”美元php bin /控制台缓存池:删除缓存。应用cache_key
您还可以删除所有项目从鉴于池(年代):
1 2 3 4 5 6 7
美元php bin /控制台缓存池:明确< cache-pool-name >#清除缓存。应用程序池”美元php bin /控制台缓存池:cache.app清晰#清除缓存。验证”和“缓存。应用程序池”美元php bin /控制台缓存:缓存池:清楚。验证cache.app
修剪缓存条目
一些缓存池不包括一个自动修剪机制过期的缓存项。例如,FilesystemAdapter缓存不移除过期的缓存项直到显式地请求一个项目,要过期了例如,通过调用Psr \缓存\ CacheItemPoolInterface:: getItem
。在特定工作负载下,这可能会导致过期缓存项持续在过期后,导致相当大的消费过剩的浪费磁盘或内存空间,过期的缓存项。
通过引入这个缺点已经解决了PruneableInterface,它定义了抽象方法删除()。的ChainAdapter,FilesystemAdapter,PdoAdapter,PhpFilesAdapter所有实现这个新接口,允许手动删除过期缓存条目:
1 2 3 4 5
使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;美元缓存=新FilesystemAdapter (“app.cache”);/ /……做一些设置和获取操作吗美元缓存- >删除();
的ChainAdapter实现并不直接包含任何修剪逻辑本身。相反,当调用链适配器的删除()方法,调用委托给它的所有兼容的缓存适配器(和那些没有实现PruneableInterface
默默的被忽视):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\缓存\适配器\ApcuAdapter;使用ob娱乐下载\组件\缓存\适配器\ChainAdapter;使用ob娱乐下载\组件\缓存\适配器\FilesystemAdapter;使用ob娱乐下载\组件\缓存\适配器\PdoAdapter;使用ob娱乐下载\组件\缓存\适配器\PhpFilesAdapter;美元缓存=新ChainAdapter ([新ApcuAdapter (),/ /没有实现PruneableInterface新FilesystemAdapter (),/ /实现PruneableInterface新PdoAdapter (),/ /实现PruneableInterface新PhpFilesAdapter (),/ /实现PruneableInterface/ /……]);/ /删除将代理调用PdoAdapter FilesystemAdapter PhpFilesAdapter,/ /当默默地跳过ApcuAdapter美元缓存- >删除();
提示
如果缓存组件内部使用Symfony应用程序中,您可以删除ob娱乐下载所有项目从所有池使用以下命令(驻留在框架包):
1
美元php bin /控制台缓存池:修剪