WordPress 对象缓存(Object Cache)是 WordPress 中缓存耗时数据库查询结果的方法,默认情况下,对象缓存是非持久性的,只在请求期间保留在内存中,请求过期后,缓存也就失效了,下次请求时则需要重新生成。
WordPress 默认对象缓存的效率问题
熟悉缓存原理的朋友会发现,这种机制的效率并不高,为了提高对象缓存的效率,我们需要持久化对象缓存,也就是说,把对象缓存的结果保留下来,不让他们在页面请求结束时失效,这样在下次页面请求时就可以直接使用保存下来的缓存结果,而不用再次查询数据库了。
使用 Redis 或 Memcached 持久化对象缓存数据
Redis 和 Memcached 都是知名的内存型数据库,因为他们可以把数据直接保存在内存中,可以大大提高数据的存取速度,他们常常被用来当作 MySQL 的缓存数据库使用。
安装 Redis 服务和 PHP Redis 扩展
Ubuntu、Debian、CentOS 发行版中都有 Redis 服务,我们直接执行对应的命令安装即可。当然如果想获得更多的控制,我们也可以自己下载源码编译 Redis 服务端。
apt-get install redis
安装 Redis 服务器后,如果启动不成功,报「MISCONF Redis is configured to save RDB snapshots」 的错误,我们可以使用 redis-cli 关闭掉数据库硬盘快照功能,因为我们只用 Redis 做缓存服务,不需要保存数据到硬盘中。
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
安装了 Redis 服务后,我们还需要安装 PHP Redis 扩展,才能让 WordPress 缓存数据到 Redis 中。
pecl install redis
Memcached 的安装方法和 Redis 类似,在这里就不再多说了。安装并确认我们需要的 Redis 或 Memcached 服务生效后,我们还需要在 WordPress 中启用 Redis 或 Memcached 对象缓存,才能利用这两个服务为我们持久化对象缓存。
在 WordPress 中启用 Redis 对象缓存
在 WordPress 中启用持久化对象缓存的方法是使用自定义缓存函数替换 WordPress 中默认的缓存函数,方法是添加一个 「object-cache.php」到「wp-content/」目录中。「object-cache.php」本质上是一个 “Drop-in” 类型的 WordPress插件,用来取代 WordPress 内置的功能。
为了把对象缓存缓存到 Redis 中,我们需要在 WordPress 中启用 Redis 对象缓存,从下面的地址中下载「object-cache.php」,然后上传到 WordPress 站点的 「wp-content/」目录中即可。
https://github.com/pressjitsu/pj-object-cache-red
Memcached 对象缓存插件
如果你使用的是 Memcached 来持久化 WordPress 对象缓存,下面两个缓存插件都可以使用,任意选择一个即可。
有些插件会自动添加「object-cache.php」到 wp-content/ 目录中,比如流行的 WP Super Cache 插件,在遇到这种情况是,直接替换这个文件即可。
如果添加了「object-cache.php」后,遇到网站出现 500 错误而打不开的情况,说明我们的 Redis 服务或扩展没有安装好,检查以下,确保他们可用,再添加「object-cache.php」即可。
在开发WordPress主题或插件时使用对象缓存
WordPress 为我们提供了使用对象缓存的函数,方便我们使用对象缓存。
- wp_cache_add() :添加数据到缓存中,如果数据已存在,返回 flase
- wp_cache_set() :添加数据到缓存中,如果数据已存在,会覆盖数据
- wp_cache_get() :获取缓存中的数据,如果数据不存在,返回 false
- wp_cache_delete() : 从缓存中删除数据
- wp_cache_replace() :替换缓存中的数据,类似 wp_cache_set,但是如果数据不存在,不自动添加
- wp_cache_flush():清除所有缓存
WordPress 对象缓存使用使用示例
$result = wp_cache_get( 'my_result' );
if ( false === $result ) {
$result = $wpdb->get_results( $query );
wp_cache_set( 'my_result', $result );
}
对象缓存和页面缓存的区别
本站之前介绍过使用 Cachify 缓存 WordPress 页面 来提高页面加载速度的方法,这种直接把 WordPress 生成的页面缓存起来的方法叫 “页面缓存”,缓存的直接是 WordPress 生成的 HTML 页面,不只缓存数据库查询,还缓存了页面模版中的 PHP 逻辑运算结果。
而对象缓存缓存的只是 MySQL 数据库查询结果,并必会缓存其他类型的 PHP 运算,相对页面缓存,更加底层,缓存粒度细,也更容易操作。另一方面,WordPress 对象缓存不只可以缓存前台数据库查询,也可以缓存仪表盘的数据查询结果,可以在一定程度上提高 WordPress 后台的打开速度。
两种缓存方法都可以大幅提高WordPress页面加载速度,页面缓存适合在没用用户登录的网站上使用;而对象缓存适合在需要用户登录操作的网站上面使用,以避免页面缓存缓存了需要用户登录才可以查看的内容。
总结
无论是页面缓存、还是对象缓存,都是用来提高数据获取效率,加快网站页面打开速度的,对象缓存和页面缓存并不冲突,可以同时使用,相互配合。虽然缓存可以提高页面打开速度,但是并不意味着,我们在开发时就不用考虑性能和效率问题了。始终把数据存取效率放在心中,才能开发出高性能的 WordPress 应用,提高用户体验。