wordpress缓存类WP_Object_Cache分析【续】

本文介绍了一种缓存管理系统中的两个关键函数:删除指定缓存ID数据与清空所有缓存数据的功能。前者允许用户根据ID删除特定缓存条目,并提供强制删除选项;后者用于快速重置整个缓存系统。

/**
* 删除组中特定缓存ID的数据
*
* 如果缓存ID不存在并且$force=false时,什么也不会发生,$force默认为false.
*
* 成功的时候$non_existant_objects中会保存该ID,表示这个缓存数据不存在.
*
* @参数 int|string $id 标识缓存中的数据
* @参数 string $group 缓存的分组
* @参数 bool $force Optional. 是否强制删除组中的缓存ID
* @返回值 bool 没有删除时返回false,删除成功时返回true.
*/
function delete($id, $group = 'default', $force = false) {
if (empty ($group))
$group = 'default';

if (!$force && false === $this->get($id, $group, false))
return false;

unset ($this->cache[$group][$id]);
$this->non_existant_objects[$group][$id] = true;
return true;
}

/**
* 清空所有缓存数据
*
* @返回值 bool 永远返回true
*/
function flush() {
$this->cache = array ();

return true;
}



续二:[url]http://baiyuxiong.iteye.com/blog/768997[/url]
你已经添加了: ```php define('WP_USE_EXT_OBJECT_CACHE', true); ``` 但 **WordPress 站点健康(Site Health)仍然提示“未启用持久化对象缓存”**,这个问题非常常见,而且往往不是配置写错了,而是 **WordPress 没有正确识别到 `object-cache.php` 这个 drop-in 文件的存在或有效性**。 --- ## 🔍 一、根本原因分析 WordPress 判断是否启用了“持久化对象缓存”的逻辑是: > ✅ 是否存在 `/wp-content/object-cache.php` > ✅ 并且 `WP_USE_EXT_OBJECT_CACHE === true` 如果这两个条件都满足,**站点健康才会显示“已启用”** 所以你现在的问题极可能是: - `object-cache.php` 文件不存在 - 或者文件权限问题导致无法加载 - 或者插件虽然安装了,但没真正“启用” - 或者 OPCache / PHP 缓存导致旧状态被缓存 --- ## ✅ 二、排查与解决方案(按优先级排序) ### ✅ 步骤 1:确认 `object-cache.php` 文件是否存在 运行命令检查: ```bash ls -la wp-content/object-cache.php ``` 你应该看到似输出: ```bash -rw-r--r-- 1 www-data www-data 12345 Jun 10 10:00 wp-content/object-cache.php ``` 📌 如果没有这个文件 → 插件只是安装了,但没有“启用” --- ### ✅ 步骤 2:在插件页面点击 “Enable Object Cache” 进入 WordPress 后台: > **Settings → Redis → Enable Object Cache** 👉 必须手动点击这个按钮! 它会做一件事:**把插件目录里的 `object-cache.php` 复制一份到 `/wp-content/object-cache.php`** ⚠️ 注意: - 这个文件是一个“drop-in”,不是普通插件 - 它必须存在于根 `wp-content/` 目录下才能生效 ✅ 成功后你会看到提示:“Object cache enabled.” ❌ 如果看不到按钮或点击无反应?继看下面。 --- ### ✅ 步骤 3:检查文件权限和所有者 ```bash # 查看文件权限 ls -l wp-content/object-cache.php ``` 确保 PHP 可读可执行(一般 644 即可): ```bash chmod 644 wp-content/object-cache.php chown www-data:www-data wp-content/object-cache.php # 根据你的服务器用户调整 ``` 否则 PHP 虽然能包含文件,但可能因权限不足而跳过。 --- ### ✅ 步骤 4:清空 OPCachePHP 缓存 OPCache缓存“目录中有哪些文件”的信息。如果你刚复制了 `object-cache.php`,但 OPCache 还没刷新,WordPress 就认为它不存在。 #### 方法一:重启 PHP-FPM ```bash sudo systemctl restart php-fpm # 或 php8.1-fpm, php8.2-fpm 等 ``` #### 方法二:使用 OPcache 重置脚本(临时) 创建一个临时文件 `clear-opcache.php`: ```php <?php // clear-opcache.php if (function_exists('opcache_reset')) { opcache_reset(); echo "✅ OPcache 已重置\n"; } else { echo "❌ OPcache 未启用或不可用\n"; } ?> ``` 访问一次这个页面,然后删除它。 --- ### ✅ 步骤 5:验证 `object-cache.php` 是否真的被加载 在主题的 `functions.php` 最后面加一段调试代码: ```php if ( ! function_exists('wp_cache_get') ) { error_log('❌ wp_cache_get 不存在!说明 object-cache.php 没加载'); } else { error_log('✅ wp_cache_get 存在,object-cache.php 已加载'); } ``` 然后查看日志: ```bash tail -f /var/log/php_errors.log ``` 你应该看到 ✅ 那条日志。 --- ### ✅ 步骤 6:手动测试 Redis 是否工作 在 `functions.php` 加入: ```php // 测试缓存读写 $test = wp_cache_get('health_test'); if ( false === $test ) { wp_cache_set('health_test', 'Redis is working!', 60); error_log('🔧 Redis: 第一次设置缓存值'); } else { error_log("🔁 Redis: 读取到缓存值: $test"); } ``` 刷新几次页面,看日志是否从“设置”变成“读取”。如果是 → Redis 实际上在工作! --- ### ✅ 步骤 7:强制让 Site Health 显示真实状态 有时候 Site Health 的结果是缓存的。 你可以强制刷新它的数据: #### 方法一:通过 WP-CLI(推荐) ```bash wp site-health check-run --field=status ``` 或者更详细: ```bash wp site-health info | grep "Persistent object cache" ``` 这比后台界面更实时。 #### 方法二:清除 Site Health 缓存 有些主机或缓存插件会缓存 Site Health 数据。 尝试: - 清除所有缓存(如 WP Rocket、W3 Total Cache) - 使用隐身窗口访问 Site Health 页面 --- ### ✅ 步骤 8:检查是否有其他插件干扰 某些缓存插件(如 W3TC、LiteSpeed Cache)会自己管理 `object-cache.php`,甚至覆盖它。 👉 检查你是否同时启用了多个缓存插件? 建议: - 只保留一个对象缓存插件(比如 Redis Object Cache) - 停用其他可能冲突的插件进行测试 --- ### ✅ 步骤 9:终极验证 —— 直接查 Redis ```bash # 登录 Redis redis-cli # 查看 key 数量 DBSIZE # 查找以当前 salt 开头的 key(如果没有设 salt,则默认前缀是随机字符串) KEYS *options:alloptions* KEYS *posts:* ``` 如果有大量 keys 出现,说明 Redis 正在缓存数据 → 功能正常,只是健康检测没识别出来! --- ## ✅ 总结:你现在应该怎么做? | 步骤 | 操作 | |------|------| | 1 | 进入后台 → 设置 → Redis → 点击 **Enable Object Cache** | | 2 | 检查 `wp-content/object-cache.php` 是否存在 | | 3 | 设置权限:`chmod 644 wp-content/object-cache.php` | | 4 | 添加 `define('WP_USE_EXT_OBJECT_CACHE', true);` 到 `wp-config.php` | | 5 | 重启 PHP-FPM 或清空 OPCache | | 6 | 用 `wp site-health info` 命令验证最新状态 | --- ## 🟢 正常情况下,成功后的表现 ✅ 在 **工具 → 站点健康 → 信息 → 服务器** 中看到: ``` 持久性对象缓存:已启用 ``` ✅ Redis CLI 中能看到 keys ✅ `wp_cache_get/set` 可正常使用 ✅ 页面加载速度提升(尤其数据库查询多的页面) --- ## ❗ 特别提醒:不要混淆“插件激活”和“启用对象缓存” | 行为 | 是否足够? | 说明 | |------|------------|------| | 安装并激活 Redis Object Cache 插件 | ❌ 不够 | 只是安装了插件 UI | | 点击 “Enable Object Cache” | ✅ 必须做 | 才会生成 `object-cache.php` drop-in 文件 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值