WordPress 对象缓存与数据库缓存

如果不对Wordpress进行深度地址,仅使用纯净的和默认主题,的效率还是不错的,当你进行了深度定制,使用了一些性能较差的主题或者插件的时候,可能会造成性能低下,这也是wordpress被很多人说慢的原因之一(其实还是慢,只不过没那么慢),很多知名网站像smashingmagazine就是用wordpress构建的。一般来说,抛去服务器的配置,wordpress的方式主要有Wordpress 对象缓存。

对象缓存

大部分带查询的Wordpress函数都使用了WordPress Object Cache(WordPress 对象缓存),它是 WordPress 的默认缓存机制,它的主要功能是把负责查询或者运算的结果按照 Key-Value 这样的方式(WordPress 还支持按照 Group 来划分和避免缓存的内容冲突)存储到对象里面,下次进行同样操作的时候,可以让直接从这个对象中取出数据,不用重复到数据库中或者其他外部网站获取数据。

WordPress Object Cache 和服务器设置关系很大,如果系统支持内存缓存,则这个对象是直接存入内存,以后在未过期之前都是直接从内存中读取的,这样效率和速度都非常快的。如果服务器不支持内存缓存的话,则只能保证在当前页面下同样的查询或者操作不再重复从数据库中读取了。

使用 WordPress 对象缓存技术其实是非常简单的:

  • 使用 wp_cache_set() 把数据写到缓存中。
  • 使用 wp_cache_get() 到缓存中读取数据。
  • 使用 wp_cache_delete() 删除缓存。

这些函数会涉及到的四个参数:

  1. $key: 对象的 key。
  2. $data: 要存的值。
  3. $group: 分组,可选参数,用来把缓存对象就行分组。
  4. $expire: 过期时间,可选参数,如果是默认缓存,这个函数没用,如果是内存缓存,是设置缓存的时间,单位是秒,默认为0(0的意思就是永远,不会自动过期)。

比如我的日常,我的日常是在另一个站上,虽然在同一台服务器上,但是还是会拖慢速度,所以我直接用了,对象缓存。

function get_my_daily(){
	$cache = wp_cache_get('my_daily');
	if($cache)
		return $cache;
	$cache = file_get_contents('http://blog.fatesinger.com/_/api/posts/latest');
	wp_cache_set('my_daily',$cache,'',60*60*24);
	return $cache;
}

上面的代码是把得到的API数据缓存到对象中,首先检查下是否已经有了缓存,如果信息没有在缓存中,或者已经过期了。wp_cache_get() 会返回 false,如果这样,你就要去数据库中重新获取这些信息。否则就返回在缓存中的信息。

数据库缓存

而数据库缓存是是指把复杂的查询结果或者外部数据作为一个临时变量储存在数据库中,当再次调用的时候只需要直接从数据库直接读取结果即可。我开发的插件网易云音乐就是使用的这种方法。

  • 使用 get_transient() 从数据库中读取数据
  • 使用 set_transient() 把数据存到数据库中
  • 使用 delete_transient() 把数据从数据库中删除

同样,这个也是有过期时间的,可以根据你的需要设置缓存时间。如果没有内容或者已经过期get_transient()会返回false。

总结

一般来说,如果你服务器支持内存缓存,比如配置了memcached,则直接使用对象缓存即可。否则一些复杂查询或者站外调用数据则可以使用数据库缓存。

我在实际应用中,调用第三方API的时候都会使用数据库缓存,尤其是海外的API,如果不做缓存的话打开速度真是慢的令人发指。我之前写的一些API调用教程都用的文件缓存,现在已经修改成数据库缓存了。