缓存池
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.1,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
缓存池
缓存池是缓存项的逻辑存储库。它们执行项目上的所有常见操作,例如保存或查找项目。缓存池独立于实际的缓存实现。因此,即使底层缓存机制从基于文件系统的缓存变为基于Redis或数据库的缓存,应用程序也可以继续使用相同的缓存池。
创建缓存池
缓存池是通过缓存适配器,它们是实现的类AdapterInterface.该组件提供了几个可以在应用程序中使用的适配器。
阵列缓存适配器
此适配器仅用于测试目的,因为内容存储在内存中,而不是以任何方式持久化。此外,后面解释的一些功能是不可用的,比如延迟保存:
1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\缓存\适配器\ArrayAdapter;$缓存=新ArrayAdapter (//秒;应用于未定义自身生存期的缓存项// 0表示无限地存储缓存项(即直到当前PHP进程结束)$defaultLifetime=0,//如果' ' true ' ',保存在缓存中的值在存储之前会被序列化$storeSerialized=真正的);
文件系统高速缓存适配器
当你想要提高应用程序的性能,但又不能在服务器上安装APC或Redis之类的工具时,这个适配器非常有用。这个适配器将内容作为常规文件存储在本地文件系统的一组目录中:
12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\缓存\适配器\FilesystemAdapter;$缓存=新FilesystemAdapter (//存放缓存项的主缓存目录的子目录$名称空间=”,//秒;应用于未定义自身生存期的缓存项// 0表示无限期地存储缓存项(即直到文件被删除)$defaultLifetime=0,//主缓存目录(应用程序需要对其具有读写权限)如果没有指定,则在系统临时目录中创建一个目录$目录=零);
APCu缓存适配器
这个适配器可以显著提高应用程序性能,因为内容缓存在服务器的共享内存中,这比文件系统快得多。它需要安装并启用PHP APCu扩展。不建议在执行大量写入和删除操作时使用它,因为它会在APCu内存中产生碎片,这会显著降低性能:
12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\缓存\适配器\ApcuAdapter;$缓存=新ApcuAdapter (//存储在这个缓存中的项的键前缀字符串$名称空间=”,//秒;应用于未定义自身生存期的缓存项// 0表示无限期地存储缓存项(即直到APC内存被删除)$defaultLifetime=0,//如果存在,则将此字符串添加到命名空间以简化//整个缓存失效(例如在部署应用程序时)$版本=零);
Redis缓存适配器
这个适配器将内容存储在服务器的内存中。与APCu适配器不同,它不局限于当前服务器的共享内存,因此您可以在需要时将内容存储在服务器集群中。
它要求已经安装了Redis,并创建了一个连接来实现\复述,
,\ RedisArray
,\ RedisCluster
或\ Predis
类:
1 2 3 4 5 6 7 8 9 10 11
使用欧宝娱乐app下载地址\组件\缓存\适配器\RedisAdapter;$缓存=新RedisAdapter (//存储到Redis系统的有效连接的对象\复述,$redisConnection,//存储在这个缓存中的项的键前缀字符串$名称空间=”,//秒;应用于未定义自身生存期的缓存项// 0表示无限地存储缓存项(即直到Redis内存被删除)$defaultLifetime=0);
链缓存适配器
该适配器允许组合任何数量的前面的适配器。缓存项从包含它们的第一个适配器获取。此外,缓存项保存在所有给定的适配器中,因此这是创建缓存复制的简单方法:
1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址\组件\缓存\适配器\ApcuAdapter;使用欧宝娱乐app下载地址\组件\缓存\适配器\ChainAdapter;使用欧宝娱乐app下载地址\组件\缓存\适配器\FilesystemAdapter;$apcCache=新ApcuAdapter ();$fileCache=新FilesystemAdapter ();$缓存=新ChainAdapter (数组($apcCache,$fileCache));
如果在第一个适配器中没有找到项,但在下一个适配器中找到项,则ChainAdapter
确保所获取的项保存在它丢失的所有适配器中。的第二个可选参数,因为不可能知道缓存项的过期日期和时间ChainAdapter
默认的生命周期是否应用于这些缓存项(默认为0
).
代理缓存适配器
这个适配器对于集成到不是用Symfony cache组件创建的应用程序缓存池中非常有用。欧宝娱乐app下载地址只要这些缓存池实现CacheItemPoolInterface
接口,这个适配器允许你从外部缓存中获取项目,并将它们保存在你的应用程序的Symfony缓存中:欧宝娱乐app下载地址
1 2 3 4
使用欧宝娱乐app下载地址\组件\缓存\适配器\ProxyAdapter;/ /……以某种方式创建$non欧宝娱乐app下载地址SymfonyCache$缓存=新ProxyAdapter ($non欧宝娱乐app下载地址SymfonyCache);
适配器接受两个额外的可选参数:命名空间(”
默认情况下)和默认生命期(0
默认情况下)。
此适配器的另一个用例是获取关于缓存命中的统计信息和度量(getHits ()
)及遗漏(getMisses ()
).
教义缓存适配器
这个适配器包装任何教义缓存provider,所以你可以在你的应用程序中使用它们,就像它们是Symfony缓存适配器一样:欧宝娱乐app下载地址
1 2 3 4 5 6
使用学说\常见的\缓存\SQLite3Cache;使用欧宝娱乐app下载地址\组件\缓存\适配器\DoctrineAdapter;$sqliteDatabase=新\ SQLite3 (__DIR__.“/缓存/ data.sqlite”);$doctrineCache=新SQLite3Cache ($sqliteDatabase,“表”);$欧宝娱乐app下载地址symfonyCache=新DoctrineAdapter ($doctrineCache);
这个适配器还定义了两个可选参数名称空间
(默认值:”
),defaultLifetime
(默认值:0
),并对它们进行调整,使它们在底层Doctrine缓存中工作。
查找缓存项
缓存池定义了三种方法来查找缓存项。最常见的方法是getItem(键)
,返回由给定键标识的缓存项:
1 2 3 4
使用欧宝娱乐app下载地址\组件\缓存\适配器\FilesystemAdapter;$缓存=新FilesystemAdapter (“app.cache”);$latest欧宝app在哪里找News=$缓存->getItem (“latest_欧宝app在哪里找news”);
如果没有为给定键定义项,则该方法不返回零
值以外的空对象,该对象实现了CacheItem类。
如果需要同时获取多个缓存项,请使用getItems(数组($key1, $key2,…)
方法:
1 2
/ /……$股票=$缓存->getItems (数组(“apple”,“facebook”,“GOOGL”,“微软”));
同样,如果任何键都不表示有效的缓存项,则不会得到零
值,但为空CacheItem
对象。
与获取缓存项相关的最后一个方法是hasItem(键)
,返回真正的
如果有一个由给定键标识的缓存项:
1 2
/ /……$hasBadges=$缓存->hasItem (“user_”.$用户标识.“_badges”);
保存缓存项
保存缓存项的最常用方法是save (),它立即将项存储在缓存中(它返回真正的
是否保存项目或假
如果发生错误):
1 2 3 4
/ /……$userFriends=$缓存->get (“user_”.$用户标识.“_friends”);$userFriends->集($用户->getFriends ());$isSaved=$缓存->保存($userFriends);
有时,为了提高应用程序的性能,您可能倾向于不立即保存对象。在这些情况下,使用saveDeferred ()方法将缓存项标记为“准备持久化”,然后调用commit ()方法,当你准备持久化它们全部时:
1 2 3 4 5 6 7 8
/ /……$isQueued=$缓存->saveDeferred ($userFriends);/ /……$isQueued=$缓存->saveDeferred ($userPreferences);/ /……$isQueued=$缓存->saveDeferred ($userRecentProducts);/ /……$isSaved=$缓存->commit ();
的saveDeferred ()
方法返回真正的
当缓存项已成功添加到“持久队列”和假
否则。的commit ()
方法返回真正的
当所有挂起的项都成功保存或假
否则。
移除缓存项
缓存池包括删除缓存项的方法,其中一部分或全部。最常见的是deleteItem (),它删除由给定键标识的缓存项(它返回真正的
当项目被成功删除或不存在时假
否则):
1 2
/ /……$isDeleted=$缓存->deleteItem (“user_”.$用户标识);
使用deleteItems ()方法同时删除多个缓存项(它返回真正的
只有当所有项都被删除时,即使它们中的任何或部分不存在):
1 2
/ /……$areDeleted=$缓存->deleteItems (数组(“category1”,“category2”));
最后,要删除池中存储的所有缓存项,请使用clear ()方法(返回真正的
当所有项目被成功删除):
1 2
/ /……$cacheIsEmpty=$缓存->明确的();