WP_对象缓存{}

实现对象缓存的核心类。

说明

WordPress对象缓存用于保存数据库的访问。“对象缓存”(Object Cache)将所有缓存数据存储到内存中,并通过使用一个键使缓存内容可用,该键用于命名缓存内容并在以后检索缓存内容。

通过将文件放在wp-settings中查看的wp-content文件夹中,可以用其他缓存机制替换对象缓存。如果该文件存在,则不包括该文件。

更多信息

WordPress对象缓存的作用

WP_对象缓存是WordPress的类,用于缓存数据,这些数据的重新生成可能需要花费大量的计算成本,例如复杂数据库查询的结果。对象缓存定义于wp-includes/cache.php.

编写插件时,不要在代码中直接使用类,而是使用wp_缓存_*下面列出的功能。

默认情况下,对象缓存是非持久的。这意味着存储在高速缓存中的数据仅在请求期间驻留在内存中。除非安装持久缓存插件。

使用瞬态API如果您需要确保数据将被缓存,请不要使用这些函数。如果配置了持久缓存,则瞬态函数将使用wp_缓存_*本文档中描述的功能。但是,如果未启用持久缓存,则数据将缓存到选项表中。

此外,一些对象缓存组被指定为“非持久”,不会缓存在持久存储中。当向缓存中添加只应在脚本会话期间可用,而不应在脚本调用(或HTTP请求)之间可用的项时,这非常有用。

wp_cache_*函数

与对象缓存交互最常用的函数有:

在最近的版本中,WordPress引入了对象缓存功能,可以帮助更有效地使用缓存。

无法使用来测试新功能是否可用函数_exists(),但必须使用进行检查wp_cache_supports()因为WordPress会聚合它们。这意味着如果对象缓存插件不支持刷新缓存组,调用wp_cache_flush_group()盲目地可能导致整个高速缓存被刷新。

if(wp_cache_supports('flush_group')){wp_cache_flush_group(“帖子”)}其他{wp_cache_flush_cache();}

持久缓存

之前WordPress 2.5版,如果添加定义('WP_CACHE',true)到您的wp-config.php文件。

现在已经不是这样了,添加定义没有任何效果除非您安装了持久缓存插件(请参阅下面的示例)。

持久缓存插件

一些缓存插件,如W3总缓存以及LiteSpeed缓存也提供对象缓存,但在WordPress中获取对象缓存不是最简单的方法,因为它们还提供浏览器、页面、资产和CDN缓存。

这个瞬态_API通过给它一个自定义名称和一个时间段来提供持久但临时的数据缓存,在此时间段之后,它将过期并重新生成。

注意:只有在发出请求时,瞬态才会被删除。因此,在有人访问您的页面并调用Transient之前,它将保留在DB中。简而言之:它不是一个真正的持久缓存,也不等同于运行在cron作业上的东西。

资源

方法

姓名说明
WP_对象缓存::__construct设置对象属性;PHP 5风格的构造函数。
WP_对象缓存::__get使私有属性可读,以实现向后兼容性。
WP_对象缓存::__isset使私有属性可检查向后兼容性。
WP_对象缓存::__set使私有属性可设置为向后兼容。
WP_对象缓存::__unset使私有属性不可设置以实现向后兼容性。
WP_对象缓存::_exists用作实用函数,以确定缓存中是否存在密钥。
WP_Object_Cache::添加如果数据不存在,则将其添加到缓存中。
WP_对象缓存::add_global_groups设置全局缓存组的列表。
WP_对象缓存::add_multiple在一次调用中向缓存添加多个值。
WP_对象缓存::decr减少数字缓存项的值。
WP_Object_Cache::删除删除组中缓存键的内容。
WP_对象缓存::delete_multiple在一次调用中从缓存中删除多个值。
WP_Object_Cache::刷新清除所有数据的对象缓存。
WP_对象缓存::flush_group删除组中的所有缓存项。
WP_Object_Cache::获取检索缓存内容(如果存在)。
WP_Object_Cache::获取多个在一次调用中从缓存中检索多个值。
WP_对象缓存::incr递增数字缓存项的值。
WP_对象缓存::is_valid_key用作确定密钥是否有效的实用函数。
WP_Object_Cache::替换如果内容已经存在,则替换缓存中的内容。
WP_Object_Cache::重置重置缓存键-已弃用
WP_Object_Cache::设置将数据内容设置到缓存中。
WP_对象缓存::set _ multiple在一次调用中为缓存设置多个值。
WP_Object_Cache::统计回显缓存的统计信息。
WP_对象缓存::switch_to_blog切换内部博客ID。

来源

类WP_Object_Cache{/***保存缓存的对象。**@自2.0.0起*@var数组*/私有$cache=array();/***缓存数据已存储在缓存中的次数。**@自2.5.0起*@var整数*/公共$cache_hits=0;/***缓存中没有请求的次数。**@自2.0.0起*@var整数*/公共$cache_misses=0;/***全局缓存组列表。**@自3.0.0起*@var字符串[]*/受保护的$global_groups=array();/***要在非全局组中的键之前添加的博客前缀。**@自3.5.0起*@var字符串*/私有$blog_prefix;/***保存is_multisite()的值。**@自3.5.0起*@var布尔*/私有$multisite;/***设置对象属性;PHP 5风格的构造函数。**@自2.0.8起*/公共函数__construct(){$this->multisite=is_multiste();$this->blog_prefix=$this->多站点?get_current_blog_id().':':'';}/***使私有属性可读,以实现向后兼容性。**@自4.0.0起**要获取的@param string$name属性。*@return混合属性。*/公共函数__get($name){返回$this->$name;}/***使私有属性可设置为向后兼容。**@自4.0.0起**要设置的@param string$name属性。*@param混合了$value属性值。*@return混合了Newly-set属性。*/公共函数__set($name,$value){返回$this->$name=$value;}/***使私有属性可检查向后兼容性。**@自4.0.0起**@param string$name属性检查是否设置。*@return bool是否设置了属性。*/公共函数__isset($name){返回isset($this->$name);}/***使私有属性不可设置为向后兼容。**@自4.0.0起**要取消设置的@param string$name属性。*/公共函数__unset($name){取消设置($this->$name);}/***用作确定密钥是否有效的实用函数。**@自6.1.0起**@param int|string$key缓存密钥以检查其有效性。*@return bool键是否有效。*/受保护的函数is_valid_key($key){if(is_int($key)){返回true;}if(is_string($key)&&trim($key)!==“”){返回true;}$type=gettype($key);如果(!function_exists('__')){wp_load_translations_early();}$message=is_string($key)? __('缓存键不能为空字符串')/*转换器:%s:给定缓存键的类型*/:sprintf(__('缓存键必须是整数或非空字符串,给定%s。'),$type);_做错了(sprintf(“%s::%s”,__CLASS__,debug_backtrace(debug_backtrace_IGNORE_ARGS,2)[1]['function']),$消息,'6.1.0');返回false;}/***用作一个实用函数,用于确定缓存中是否存在密钥。**@自3.4.0起**@param int | string$key缓存密钥以检查是否存在。*@param string$group用于密钥存在性检查的缓存组。*@return bool给定组的缓存中是否存在密钥。*/受保护函数_exists($key,$group){返回isset($this->cache[$group])&&(isset($this->缓存[$group][$key])||array_key_exists($key,$this->缓存[$group]));}/***如果数据不存在,则将其添加到缓存中。**@自2.0.0起**@使用WP_Object_Cache::_exists()检查缓存是否已经有数据。*@uses WP_Object_Cache::set()检查缓存后设置数据*内容存在。**@param int | string$key要调用缓存中内容的内容。*@param混合了$data要存储在缓存中的内容。*@param string$group可选。缓存内容的分组位置。默认为“Default”。*@param int$expire可选。何时使缓存内容过期(秒)。*默认值为0(无过期)。*@return bool成功时为True,如果缓存键和组已存在则为false。*/公共函数add($key,$data,$group=“默认”,$expire=0){if(wp_suspend_cache_addition()){返回false;}如果(!$this->is_valid_key($key)){返回false;}if(空($group)){$group=“默认”;}$id=$key;if($this->multisite&&!isset($thix->globalgroups[$group])){$id=$this->blog_prefix$密钥;}if($this->_exists($id,$group)){返回false;}返回$this->set($key、$data、$group、(int)$expire);}/***在一次调用中向缓存添加多个值。**@自6.0.0起**@param array$data要添加的键和值的数组。*@param string$group可选。缓存内容分组的位置。默认为空。*@param int$expire可选。何时使缓存内容过期,以秒为单位。*默认值为0(无过期)。*@return bool[]返回值数组,按键分组。每个值都是*成功时为true,如果缓存键和组已经存在,则为false。*/公共函数add_multiple(数组$data,$group='',$expire=0){$values=数组();foreach($data作为$key=>$value){$values[$key]=$this->add($key、$value、$group、$expire);}返回$values;}/***如果内容已经存在,则替换缓存中的内容。**@自2.0.0起**@请参阅WP_Object_Cache::set()**@param int | string$key要调用缓存中内容的内容。*@param混合了$data要存储在缓存中的内容。*@param string$group可选。缓存内容的分组位置。默认为“Default”。*@param int$expire可选。何时使缓存内容过期(秒)。*默认值为0(无过期)。*@return bool如果内容被替换,则为True;如果原始值不存在,则为false。*/公共函数替换($key,$data,$group='default',$expire=0){如果(!$this->is_valid_key($key)){返回false;}if(空($group)){$group=“默认”;}$id=$key;if($this->multisite&&!isset($thix->globalgroups[$group])){$id=$this->blog_prefix$密钥;}if(!$this->_exists($id,$group)){返回false;}返回$this->set($key、$data、$group、(int)$expire);}/***将数据内容设置到缓存中。**缓存内容由$group参数分组,后跟*$键。这允许在唯一组中复制ID。因此,命名*该组应小心使用,并应遵循正常功能*WordPress核心用法之外的命名指南。**未使用$expire参数,因为缓存将自动*每次访问页面和PHP完成时都会过期。方法是*更多关于使用文件的缓存插件。**@自2.0.0起*@since 6.1.0如果缓存键无效,则返回false。**@param int | string$key要调用缓存中内容的内容。*@param混合了$data要存储在缓存中的内容。*@param string$group可选。缓存内容的分组位置。默认为“Default”。*@param int$expire可选。未使用。*@return bool如果设置了内容,则为True;如果键无效,则为false。*/公共函数集($key、$data、$group=“default”、$expire=0){如果(!$this->is_valid_key($key)){返回false;}if(空($group)){$group=“默认”;}if($this->multisite&&!isset($thix->globalgroups[$group])){$key=$this->blog_prefix$密钥;}if(is_object($data)){$data=克隆$data;}$this->cache[$group][$key]=$data;返回true;}/***在一次调用中为缓存设置多个值。**@自6.0.0起**@param array$data要设置的键和值的数组。*@param string$group可选。缓存内容分组的位置。默认为空。*@param int$expire可选。何时使缓存内容过期(秒)。*默认值为0(无过期)。*@return bool[]返回值数组,按键分组。每个值始终为true。*/公共函数set_multiple(数组$data,$group='',$expire=0){$values=数组();foreach($data作为$key=>$value){$values[$key]=$this->集合($key,$value,$group,$expire);}返回$values;}/***检索缓存内容(如果存在)。**将首先尝试通过搜索检索内容*缓存组中的键。如果缓存命中(成功),则内容*返回。**失败时,缓存未命中数将增加。**@自2.0.0起**@param int | string$key存储缓存内容的键。*@param string$group可选。缓存内容分组的位置。默认为“Default”。*@param bool$force可选。未使用。是否强制更新本地缓存*来自持久缓存。默认为false。*@param bool$已找到可选项。是否在缓存中找到密钥(通过引用传递)。*消除返回可存储值false的歧义。默认为null。*@return mixed | false成功时缓存内容,检索内容失败时为false。*/公共函数get($key,$group=“default”,$force=false,&$found=null){如果(!$this->is_valid_key($key)){返回false;}if(空($group)){$group=“默认”;}if($this->multisite&&!isset($thix->globalgroups[$group])){$key=$this->blog_prefix$密钥;}if($this->_exists($key,$group)){$found=true;$this->cache_hits+=1;if(isobject($this->cache[$group][$key]){返回克隆$this->cache[$group][$key];}其他{返回$this->cache[$group][$key];}}$found=false;$this->cache_misses+=1;返回false;}/***在一次调用中从缓存中检索多个值。**@自5.5.0起**@param array$keys存储缓存内容的键的数组。*@param string$group可选。缓存内容分组的位置。默认为“Default”。*@param bool$force可选。是否强制更新本地缓存*来自持久缓存。默认为false。*@return数组返回值的数组,按键分组。每个值都是*成功时缓存内容,失败时缓存内容为false。*/公共函数get_multiple($keys,$group='default',$force=false){$values=数组();foreach($keys作为$key){$values[$key]=$this->get($key、$group、$force);}返回$values;}/***删除组中缓存键的内容。**如果组中不存在缓存密钥,则不会发生任何事情。**@自2.0.0起**@param int | string$key缓存中的内容被调用。*@param string$group可选。缓存内容分组的位置。默认为“默认”。*@param bool$已弃用可选。未使用。默认为false。*@return bool成功时为True,未删除内容时为false。*/公共函数删除($key,$group=“default”,$deprecated=false){如果(!$this->is_valid_key($key)){返回false;}if(空($group)){$group=“默认”;}if($this->multisite&&!isset($thix->globalgroups[$group])){$key=$this->blog_prefix$密钥;}if(!$this->_exists($key,$group)){返回false;}unset($this->cache[$group][$key]);返回true;}/***在一次调用中从缓存中删除多个值。**@自6.0.0起**@param array$keys要删除的键的数组。*@param string$group可选。缓存内容分组的位置。默认为空。*@return bool[]返回值数组,按键分组。每个值都是*如果成功,则返回true;如果未删除内容,则返回false。*/公共函数delete_multiple(数组$keys,$group=''){$values=数组();foreach($keys作为$key){$values[$key]=$this->delete($key,$group);}返回$values;}/***增加数字缓存项的值。**@自3.3.0起**@param int | string$key要递增的缓存键。*@param int$offset可选。项目值的增量。*默认值1。*@param string$group可选。密钥所在的组。默认为“Default”。*@return int | false成功时项的新值,失败时为false。*/公共函数incr($key,$offset=1,$group='default'){如果(!$this->is_valid_key($key)){返回false;}if(空($group)){$group=“默认”;}if($this->multisite&&!isset($thix->globalgroups[$group])){$key=$this->blog_prefix$密钥;}if(!$this->_exists($key,$group)){返回false;}if(!is_numeric($this->cache[$group][$key]){$this->缓存[$group][$key]=0;}$offset=(int)$offset;$this->cache[$group][$key]+=$offset;if($this->cache[$group][$key]<0){$this->缓存[$group][$key]=0;}返回$this->cache[$group][$key];}/***减少数字缓存项的值。**@自3.3.0起**@param int | string$key要递减的缓存键。*@param int$offset可选。项目值的递减量。*默认值1。*@param string$group可选。密钥所在的组。默认为“Default”。*@return int | false成功时项的新值,失败时为false。*/公共函数decr($key,$offset=1,$group='default'){如果(!$this->is_valid_key($key)){返回false;}if(空($group)){$group=“默认”;}if($this->multisite&&!isset($thix->globalgroups[$group])){$key=$this->blog_prefix$密钥;}if(!$this->_exists($key,$group)){返回false;}if(!is_numeric($this->cache[$group][$key]){$this->缓存[$group][$key]=0;}$offset=(int)$offset;$this->cache[$group][$key]-=$offset;if($this->cache[$group][$key]<0){$this->缓存[$group][$key]=0;}返回$this->cache[$group][$key];}/***清除所有数据的对象缓存。**@自2.0.0起**@return true总是返回true。*/公共函数flush(){$this->cache=array();返回true;}/***删除组中的所有缓存项。**@自6.1.0起**@param string$group要从缓存中删除的组的名称。*@return true始终返回true。*/公共函数flush_group($group){unset($this->cache[$group]);返回true;}/***设置全局缓存组的列表。**@自3.0.0起**@param string | string[]$groups全局组的列表。*/公共函数add_global_groups($groups){$groups=(数组)$groups;$groups=array_fill_keys($groups,true);$this->global_groups=array_merge($this->全局组,$groups);}/***切换内部博客ID。**这将更改用于在博客特定组中创建密钥的博客ID。**@自3.5.0起**@param int$blog_id博客id。*/公共函数switch_to_blog($blog_id){$blog_id=(int)$blog_ id;$this->blog_prefix=$this->多站点$博客id。':':';}/***重置缓存键。**@自3.0.0起**@deprecated 3.5.0使用WP_Object_Cache::switch_to_blog()*@请参阅switch_to_blog()*/公共函数reset(){_弃用的函数(__function__,'3.5.0','WP_Object_Cache::switch_to_blog()');//清除非全局缓存,因为博客ID已更改。foreach(array_keys($this->cache)作为$group){if(!isset($this->globalgroups[$group]){unset($this->cache[$group]);}}}/***回显缓存的统计信息。**提供缓存命中和缓存未命中。还打印每个缓存的组,*键和数据。**@自2.0.0版本起*/公共函数stats(){echo“<p>”;echo“<strong>缓存命中:</strong>{$this->Cache_Hits}<br/>”;echo“缓存未命中:</strong>{$this->Cache_Misses}<br/>”;echo“</p>”;echo“<ul>”;foreach($this->cache作为$group=>$cache){echo“<li><strong>组:</strong>”。esc_html($group)。’-('.number_format(strlen(serialize($cache))/KB_IN_BYTES,2)。'k)</li>';}echo“</ul>”;}}

变更日志

版本说明
2.0.0介绍。

用户贡献的笔记

  1. 跳到注释6内容

    需要注意的是,对象没有被引用,但对象的克隆存储在缓存中!

    如果在将对象添加到缓存后更新对象,缓存中的项不会更改,除非使用新对象更新缓存

    类SomeItem{私有$value=0;函数add(){$this->value++;}函数show(){echo“{$this->value}n”;}}$item=新SomeItem;$item->show();//打印“0”wp_cache_set(“测试-1”,$item);//将项写入对象缓存后进行修改。//此调用更新本地对象,但不更新缓存中的项!$item->add();$item->show();//打印“1”//从缓存中获取项目。$item=wp_cache_get(“测试-1”);$item->show();//打印“0”可能是一个意想不到的结果。

    参考资料:这是核心功能的相关部分.

    解决方案:
    由于WordPress只克隆对象(使用“clone”关键字),因此有几种方法可以绕过限制,只需最少的额外代码,例如:

    类SomeItem{私有$value=0;函数add(){$this->value++;}函数show(){echo“{$this->value}n”;}}$item=新SomeItem;$item->show();//"0"//将实例分配给数组。阵列不会被克隆,引用将保持不变:$cacheData=['ref'=>$item];//缓存打包的实例:wp_cache_set('test-1',$cacheData);//将项写入对象缓存后进行修改。$item->add();$item->show();//"1"//从缓存中获取包装的实例。$cacheData=wp_cache_get('test-1');$item=$cacheData['ref'];//从数组中检索实际实例$item->show();//按预期打印“1”!

    助手功能:

    //设置器函数wp_cache_set_ref($key,$data,$group='',$expire=0){返回wp_cache_set($key,['ref'=>$data],$group,$expire);}
    //Getter公司函数wp_cache_get_ref($key,$group='',$force=false,&$found=null){$wrapper=wp_cache_get($key、$group、$force、$found);if(is_array($wrapper)&&array_key_exists('ref',$wrappers)){return$wrapper['ref'];}返回$wrapper;}
    //用法类SomeItem{私有$value=0;函数add(){$this->value++;}函数show(){echo“{$this->value}n”;}}$item=新SomeItem;$item->show();//"0"wp_cache_set_ref('test-1',$item);$item->add();$item->show();//"1"$item=wp_cache_get_ref(“测试-1”);$item->show();//"1"
  2. 跳到注释7内容

    很容易忽略这一点,但重要的是要记住,缓存的实际过期时间取决于是否在用户的站点上设置了持久缓存。

    如果没有设置持久缓存,则缓存不会在页面加载期间持久存在,因此过期时间是多少并不重要。

    然而,如果安装了ispersistentcache,并且没有设置过期时间,那么缓存可能会变得“粘滞”,并且比预期的更持久。这可能会导致测试中无法显示的问题。

    设置过期时间来避免这种情况可能是一种好做法。

  3. 跳到注释8内容

    对象缓存用于缓存昂贵的SQL查询的结果。因此,它们不会在页面加载中多次执行。在下面的示例中,假设$query变量是一个昂贵的SQL查询。

    $result=wp_cache_get('my_result');if(false===$result){$result=$wpdb->get_results($query);wp_cache_set('my_result',$result);} //使用$result;

你必须登录在能够发表注释或反馈之前。