由于V9与之前版本的兼容性相对较差,请仔细阅读迁移指南,以确保您能够最顺利地迁移。最大的变化之一是配置系统,它现在是一个对象,取代了我们当时用来实现的原始数组。另请注意,V9 至少需要 PHP 8 或更高版本才能正常工作。
更多信息请参见 Wiki 抽象的简单性:一个类可用于多个后端缓存。您不需要多次重写代码。
请随意通过提出新的Pull 请求来推荐一名驱动程序,我们欢迎他们!
普通司机 | 高性能驱动器 | 开发驱动(核心) | 集群聚合驱动程序(核心) |
---|---|---|---|
Apcu (核心)(APC 支持已移除) | Arangodb (扩展) | Devnull | FullReplicationCluster |
Dynamodb (扩展) | Cassandra (Datastax 不再维护 PHP 扩展,可能会在 v10 中弃用) | Devrandom | SemiReplicationCluster |
Files (核心) | CouchBasev3 (核心)(从 v10 开始将被弃用) | Memory (以前称为 Memstatic ) | MasterSlaveReplicationCluster |
Firestore (扩展) | CouchBasev4 (扩展) | RandomReplicationCluster | |
Leveldb (核心) | Couchdb (扩展) | ||
Memcache(d) (核心) | Mongodb (扩展) | ||
Solr (扩展) | Predis (核心) | ||
Sqlite (核心) | Ravendb _(扩展) | ||
Wincache (核心)(自 v9.2 起已弃用,自 v10 起将被删除) | Relay (2024 年底前) | ||
Zend Disk Cache (核心) | Redis / RedisCluster (核心) | ||
Ssdb (核心) | |||
Zend Memory Cache (核心) |
* 驱动程序描述可在 DOCS/DRIVERS.md 中找到
从 v9.2 开始,发布了新的 Couchbase 扩展: Couchbasev4 还添加了新的驱动程序扩展: Ravendb
。驱动程序将在该功能中积极开发,以实现更好的细粒度配置。这个新扩展是 Phpfastcache 和其他一些扩展新时代的开始:
许多驱动程序已作为独立扩展从核心移至自己的子存储库: Arangodb
、 Couchdb
、 Dynamodb
、 Firestore
、 Mongodb
、 Solr
。
它们可以通过composer轻松添加,例如: composer install phpfastcache/couchbasev4-extension
但是,出于兼容性原因, Couchbasev3
将保留在核心中,但将被弃用。
Phpfastcache 已开发多年,主要目标有 3 个:
Phpfastcache 为您提供了很多有用的 API:
方法 | 返回 | 描述 |
---|---|---|
addTag($tagName) | ExtendedCacheItemInterface | 添加标签 |
addTags(array $tagNames) | ExtendedCacheItemInterface | 添加多个标签 |
append($data) | ExtendedCacheItemInterface | 将数据追加到字符串或数组(推送) |
decrement($step = 1) | ExtendedCacheItemInterface | 多余的笑话... |
expiresAfter($ttl) | ExtendedCacheItemInterface | 允许您延长条目的生命周期而不改变其值(以前称为 touch()) |
expiresAt($expiration) | ExtendedCacheItemInterface | 设置此缓存项的过期时间(作为 DateTimeInterface 对象) |
get() | mixed | 显然,getter 返回你的缓存对象 |
getCreationDate() | DatetimeInterface | 获取此缓存项的创建日期(作为 DateTimeInterface 对象)* |
getDataAsJsonString() | string | 以格式良好的 json 字符串形式返回数据 |
getEncodedKey() | string | 返回最终和内部项目标识符(键),通常用于调试目的 |
getExpirationDate() | ExtendedCacheItemInterface | 获取 Datetime 对象形式的到期日期 |
getKey() | string | 返回项目标识符(键) |
getLength() | int | 如果数据是字符串、数组或实现Countable 接口的对象,则获取数据长度。 |
getModificationDate() | DatetimeInterface | 获取此缓存项的修改日期(作为 DateTimeInterface 对象)* |
getTags() | string[] | 获取标签 |
hasTag(string $tagName) | bool | 检查缓存项是否包含一个特定标签 |
hasTags(array $tagNames, int $strategy): bool | bool | 检查缓存项是否包含一个或多个具有可选策略的特定标记(默认为 TAG_STRATEGY_ONE) |
isTagged(): bool | bool | 检查缓存项是否至少有一个标签 (v9.2) |
getTagsAsString($separator = ', ') | string | 获取以 $separator 分隔的字符串形式的数据 |
getTtl() | int | 获取整数形式的剩余生存时间 |
increment($step = 1) | ExtendedCacheItemInterface | 让我们可以依赖一个整数项 |
isEmpty() | bool | 尽管命中/未命中状态,仍检查数据是否为空。 |
isExpired() | bool | 检查您的缓存条目是否过期 |
isHit() | bool | 检查你的缓存条目是否存在并且仍然有效,它相当于 isset() |
isNull() | bool | 尽管存在命中/未命中状态,但仍检查数据是否为空。 |
prepend($data) | ExtendedCacheItemInterface | 将数据添加到字符串或数组(unshift) |
removeTag($tagName) | ExtendedCacheItemInterface | 删除标签 |
removeTags(array $tagNames) | ExtendedCacheItemInterface | 删除多个标签 |
set($value) | ExtendedCacheItemInterface | 对于那些错过它的人来说,setter 可以是除资源或非序列化器对象(例如:PDO 对象、文件指针等)之外的任何内容。 |
setCreationDate($expiration) | DatetimeInterface | 设置此缓存项的创建日期(作为 DateTimeInterface 对象)* |
setEventManager($evtMngr) | ExtendedCacheItemInterface | 设置事件管理器 |
setExpirationDate() | ExtendedCacheItemInterface | expireAt() 的别名(更多代码逻辑) |
setModificationDate($expiration) | DatetimeInterface | 设置此缓存项的修改日期(作为 DateTimeInterface 对象)* |
setTags(array $tags) | ExtendedCacheItemInterface | 设置多个标签 |
* 需要启用配置指令“itemDetailedDate”,否则将抛出 LogicException |
方法(按字母顺序) | 返回 | 描述 |
---|---|---|
appendItemsByTag($tagName, $data) | bool | 通过标签附加项目 |
appendItemsByTags(array $tagNames, $data) | bool | 按多个标签名称之一附加项目 |
attachItem($item) | void | (重新)将项目附加到池中 |
clear() | bool | 允许您完全清空缓存并从头开始 |
commit() | bool | 保留所有延迟的缓存项 |
decrementItemsByTag($tagName, $step = 1) | bool | 按标签递减项目 |
decrementItemsByTags(array $tagNames, $step = 1) | bool | 按多个标签名称之一递减项目 |
deleteItem($key) | bool | 删除一个项目 |
deleteItems(array $keys) | bool | 删除一项或多项 |
deleteItemsByTag($tagName) | bool | 通过标签删除项目 |
deleteItemsByTags(array $tagNames, int $strategy) | bool | 通过多个标签名称之一删除项目 |
detachItem($item) | void | 从池中分离一个项目 |
getConfig() | ConfigurationOption | 返回配置对象 |
getConfigOption($optionName); | mixed | 通过其键$optionName 返回配置值 |
getDefaultConfig() | ConfigurationOption | 返回默认配置对象(不被对象实例更改) |
getDriverName() | string | 返回当前驱动程序名称(不带命名空间) |
getEventManager() | EventManagerInterface | 获取事件管理器 |
getHelp() | string | 为特定驱动程序提供非常基本的帮助 |
getInstanceId() | string | 返回实例 ID |
getItem($key) | ExtendedCacheItemInterface | 检索项目并在未找到时返回空项目 |
getItems(array $keys) | ExtendedCacheItemInterface[] | 检索一个或多个项目并返回一组项目。从 v9.2 开始,已对此方法进行了内部改进。 |
getAllItems(string $pattern = '') | ExtendedCacheItemInterface[] | (v9.2)检索所有缓存项目,硬限制为 9999 个项目。支持仅限于某些驱动程序 |
getItemsAsJsonString(array $keys) | string | 返回 表示项目数组的 json 字符串 |
getItemsByTag($tagName, $strategy) | ExtendedCacheItemInterface[] | 按标签返回项目 |
getItemsByTags(array $tagNames, $strategy) | ExtendedCacheItemInterface[] | 按多个标签名称之一返回项目 |
getItemsByTagsAsJsonString(array $tagNames, $strategy) | string | 返回 一个 json 字符串,表示对应的项目数组 |
getStats() | DriverStatistic | 将缓存统计信息作为对象返回,可用于检查缓存使用的磁盘空间等。 |
hasEventManager() | bool | 检查事件管理器 |
hasItem($key) | bool | 测试某个项目是否存在 |
incrementItemsByTag($tagName, $step = 1, $strategy) | bool | 按标签增加项目 |
incrementItemsByTags(array $tagNames, $step = 1, $strategy) | bool | 按多个标签名称之一递增项目 |
isAttached($item) | bool | 验证项目是否(仍然)附加 |
prependItemsByTag($tagName, $data, $strategy) | bool | 在项目前面添加标签 |
prependItemsByTags(array $tagNames, $data, $strategy) | bool | 在项目前面添加多个标签名称之一 |
save(CacheItemInterface $item) | bool | 立即保留缓存项 |
saveDeferred(CacheItemInterface $item) | bool | 设置稍后保留的缓存项 |
saveMultiple(...$items) | bool | 立即保留多个缓存项 |
setEventManager(EventManagerInterface $evtMngr) | ExtendedCacheItemPoolInterface | 设置事件管理器 |
在V8中:现在支持标记多种策略( $strategy
):
TaggableCacheItemPoolInterface::TAG_STRATEGY_ONE
允许您通过至少一个指定的匹配标记获取缓存项。默认行为。TaggableCacheItemPoolInterface::TAG_STRATEGY_ALL
允许您通过所有指定的匹配标记获取缓存项(缓存项可以具有其他标记)TaggableCacheItemPoolInterface::TAG_STRATEGY_ONLY
允许您仅通过指定的匹配标签获取缓存项(缓存项不能有其他标签)它还支持多个调用、标记、设置文件夹进行缓存。请参阅我们的示例文件夹以获取更多信息。
Phpfastcache 提供了一个类,为您提供有关 Phpfastcache 安装的基本信息
PhpfastcacheApi::GetVersion();
PhpfastcacheApi::getChangelog();
PhpfastcacheApi::getPhpfastcacheVersion();
PhpfastcacheApi::getPhpfastcacheChangelog();
好消息,从 V6 开始,提供了 Psr16 适配器,以使用非常基本的 getter/setter 来保持缓存最简单:
get($key, $default = null);
set($key, $value, $ttl = null);
delete($key);
clear();
getMultiple($keys, $default = null);
setMultiple($values, $ttl = null);
deleteMultiple($keys);
has($key);
基本用法:
<?php
use Phpfastcache Helper Psr16Adapter ;
$ defaultDriver = ' Files ' ;
$ Psr16Adapter = new Psr16Adapter ( $ defaultDriver );
if (! $ Psr16Adapter -> has ( ' test-key ' )){
// Setter action
$ data = ' lorem ipsum ' ;
$ Psr16Adapter -> set ( ' test-key ' , ' lorem ipsum ' , 300 ); // 5 minutes
} else {
// Getter action
$ data = $ Psr16Adapter -> get ( ' test-key ' );
}
/**
* Do your stuff with $data
*/
在内部,Psr16 适配器通过缓存管理器调用 Phpfastcache Api。
从V6开始,Phpfastcache提供了事件机制。您可以通过将 Closure 传递给活动事件来订阅事件:
<?php
use Phpfastcache EventManager ;
/**
* Bind the event callback
*/
EventManager:: getInstance ()-> onCacheGetItem ( function ( ExtendedCacheItemPoolInterface $ itemPool , ExtendedCacheItemInterface $ item ){
$ item -> set ( ' [HACKED BY EVENT] ' . $ item -> get ());
});
事件回调可以取消绑定,但您必须先为回调提供名称:
<?php
use Phpfastcache EventManager ;
/**
* Bind the event callback
*/
EventManager:: getInstance ()-> onCacheGetItem ( function ( ExtendedCacheItemPoolInterface $ itemPool , ExtendedCacheItemInterface $ item ){
$ item -> set ( ' [HACKED BY EVENT] ' . $ item -> get ());
}, ' myCallbackName ' );
/**
* Unbind the event callback
*/
EventManager:: getInstance ()-> unbindEventCallback ( ' onCacheGetItem ' , ' myCallbackName ' );
从V8开始,您可以简单地订阅 Phpfastcache 的每个事件。
有关实施和事件的更多信息可在 Wiki 上找到
从 V6 开始,Phpfastcache 提供了一些帮助程序来使您的代码更容易。
未来可能会有更多,请随时贡献!
查看 WIKI 了解如何实现聚合缓存集群功能。
composer require phpfastcache/phpfastcache
<?php
use Phpfastcache CacheManager ;
use Phpfastcache Config ConfigurationOption ;
// Setup File Path on your config files
// Please note that as of the V6 .1 the "path" config
// can also be used for Unix sockets ( Redis , Memcache , etc )
CacheManager:: setDefaultConfig ( new ConfigurationOption ([
' path ' => ' /var/www/phpfastcache.com/dev/tmp ' , // or in windows "C:/tmp/"
]));
// In your class , function , you can call the Cache
$ InstanceCache = CacheManager:: getInstance ( ' files ' );
/**
* Try to get $products from Caching First
* product_page is "identity keyword";
*/
$ key = " product_page " ;
$ CachedString = $ InstanceCache -> getItem ( $ key );
$ your_product_data = [
' First product ' ,
' Second product ' ,
' Third product '
/* ... */
];
if (! $ CachedString -> isHit ()) {
$ CachedString -> set ( $ your_product_data )-> expiresAfter ( 5 ); //in seconds , also accepts Datetime
$ InstanceCache -> save ( $ CachedString ); // Save the cache item just like you do with doctrine and entities
echo ' FIRST LOAD // WROTE OBJECT TO CACHE // RELOAD THE PAGE AND SEE // ' ;
echo $ CachedString -> get ();
} else {
echo ' READ FROM CACHE // ' ;
echo $ CachedString -> get ()[ 0 ]; // Will print ' First product'
}
/**
* use your products here or return them;
*/
echo implode ( ' <br /> ' , $ CachedString -> get ()); // Will echo your product list
对于好奇的开发人员,这里还有很多其他示例。
发现问题或有想法?来这里让我们知道!