一文详解 WordPress 中使用 Memcached 的常见问题

前面我们介绍了「使用 Memcached 内存缓存来实现 WordPress 站点秒开」,虽然感觉介绍得非常清楚,但是还是有很多小伙伴还是会碰到这样那样的问题,今天就把其中的常见的问题整理到一起发布,方便大家查看和 Debug,也欢迎收藏和分享该文,帮到更多的人解决问题。

文章目录
  1. 如何正确安装 Memcached?
  2. 使用哪个 Memcached PHP 扩展?
  3. 如何判断 Memcached 安装成功?
  4. 同台服务器多个站点如何同时使用?
  5. 缓存过期时间如何设置超过30天?

如何正确安装 Memcached?

1. 首先服务器需要安装「Memcached 服务端」,然后 PHP 需要安装上「Memcached 扩展

2. WPJAM Basic 插件已经集成 Memcached 的功能,将 wpjam-basic/template/ 目录下的 object-cache.php 文件复制到 wp-content 目录下,注意不是 wp-content/plugins/

3. WordPress 会自动检查在 wp-content 目录下是否有 object-cache.php 文件,如果有,直接调用它作为 WordPress 对象缓存机制。

使用哪个 Memcached PHP 扩展?

Memcache 有 两个 PHP 扩展:“PHP Memcache 扩展” 和 “PHP Memcached 扩展”,两者仅仅相差一个字母 D,这是我们搞混的地方。

PHP Memcache 扩展是用 PHP 实现的,支持面向对象和面向过程两种接口,2004年就实现了,是老客户端,而且功能少,属性也可设置的少。

PHP Memcached 扩展基于 libmemcached 开发的,使用 libmemcached 库提供的 API 与 Memcached 服务进行交互,只支持面向对象的接口,2009年才实现,Memcached 扩展功能更加完善,支持的函数更多,比如支持批量操作,现在一般建议使用 Memcached 扩展

WPJAM Basic 的  object-cache.php  是基于 PHP 的 Memcached 扩展实现的,所以一定要使用 PHP Memcached 扩展,不要搞错了,我们可以同样在「系统信息」的 PHP 扩展中看到:

如何判断 Memcached 安装成功?

如果成功安装,WPJAM Basic 会自动在 WordPress 后台「WPJAM」菜单下的的「系统信息」 子菜单中看到 Memcached 的信息:

Memcached 命中率

再次重复一下,只有这个界面显示正常才是 Memcached 安装成功,如果显示任何异常,那就是可能 Memcached 服务端或者其 PHP 扩展安装错了,不是程序出错,也不用来和我我说程序报错,这时候应该找你的服务器管理员(你自己?)帮你检查 Memcached 安装是否错误。

同台服务器多个站点如何同时使用?

在同台服务器上的多个 WordPress 站点如果同时启用了 Memcached,可能会出现这样的问题:访问一个网站会跳转到另外一个网站,数据会串了。

这是怎么回事呢?这是因为 object-cache.php 是使用 WordPress 的表前缀($table_prefix)来区分不同站点在内存中的缓存的

如果你在同个服务器多个 WordPress 网站的表前缀都相同,都是默认的 wp_,那么 object-cache.php 就无法区分是哪个站点了。

有两个解决方法:

1. 修改表前缀,让不同的 WordPress 博客使用不同的表前缀,我开发了一个 WordPress 数据库表前缀修改器,一键生成修改数据库表前缀所需的SQL,让你在 WordPress 修改表前缀之后能够更加方便全站修改。

2. 如果修改表前缀不方便,我还提供了 WP_CACHE_KEY_SALT 这个缓存 key 盐值的常量,你只需要在不同站点的 wp-config.php 文件定义不同的 WP_CACHE_KEY_SALT 值即可

更将详细的设置和说明,可以看这篇文章:同台服务器上多个 WordPress 站点如何使用同个 Memcached?

缓存过期时间如何设置超过30天?

根据 WordPress 的对象缓存提供的缓存函数的用法,使用 wp_cache_set 函数进行缓存数据的时候,如果把缓存过期时间设置为 60×60×24×365 也是就是一年,然后写入缓存,结果返回 true,说明已经正确地存储到 Memcached 中。

但是在使用函数 wp_cache_get 去获取的时候,总是返回 null,最后查手册才发现,Memcahced 设置过期时间要注意特殊情况

  • 缓存过期时间是一个 Unix 时间戳,也可以是一个从现在算起的以秒为单位的数字
  • 那么怎么判断是 Unix 时间戳还是一个从现在算起的以秒为单位的数字呢?
  • 小于 60×60×24×30(30天时间的秒数),就算是从现在算起的以秒为单位的数字。
  • 如果大于 60×60×24×30,则会将其作为一个真实的Unix时间戳来处理而不是自当前时间的偏移。
  • 如果缓存过期时间被设置为0(默认),此元素永不过期(但是可能会因为 Memcached 分配的内存用完,为了给其他新的元素分配空间而被删除)。

所以如果真的要设置缓存过期时间为一年后,其值应该设置为: time()+60×60×24×365

而不是 60×60×24×365,这是北京时间 1971-01-01 08:00:00 的时间戳,一个过去的时间,获取的时候已经过期了,返回自然是 null,不存在了。


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。