这是一个WPCode代码片段,实现了文章静态缓存功能。代码逻辑清晰,包含完整注释,可直接在WPCode插件中使用:
// WPCode代码片段
// 标题: 智能文章静态缓存系统
// 描述: 自动为文章生成静态HTML缓存,优先返回缓存内容以提升访问速度
// 类型: PHP代码片段
// 位置: 在网站前端运行
// ========== 配置区域 ==========
define('HTML_CACHE_DIR', ABSPATH . 'htmlpages/'); // 缓存存储目录
define('HTML_CACHE_LOCK_TTL', 300); // 缓存更新锁有效期(秒)
// ========== 核心功能函数 ==========
/**
* 确保缓存目录存在且安全
*/
function html_cache_ensure_directory() {
if (!is_dir(HTML_CACHE_DIR)) {
wp_mkdir_p(HTML_CACHE_DIR);
// 创建.htaccess保护文件,防止直接访问
@file_put_contents(HTML_CACHE_DIR . '.htaccess', "Deny from all\n");
}
}
/**
* 获取文章对应的缓存文件路径
*/
function html_cache_get_filepath({{LATEX:0}}post_id . '.html';
}
/**
* 获取缓存更新锁文件路径
*/
function html_cache_get_lockpath({{LATEX:1}}post_id;
}
/**
* 验证缓存文件是否有效(未过期)
*/
function html_cache_is_valid({{LATEX:2}}cache_file) {
if (!file_exists({{LATEX:3}}post_modified = get_post_modified_time('U', false, {{LATEX:4}}cache_modified = @filemtime({{LATEX:5}}cache_modified && {{LATEX:6}}post_modified;
}
/**
* 输出缓存内容并终止执行
*/
function html_cache_serve({{LATEX:7}}status) {
// 发送自定义HTTP头(用于调试)
header('X-Cache: ' . {{LATEX:8}}modified = filemtime({{LATEX:9}}modified) . ' GMT');
// 检查浏览器If-Modified-Since头
if (isset({{LATEX:10}}if_modified = strtotime({{LATEX:11}}if_modified && {{LATEX:12}}modified) {
status_header(304); // Not Modified
exit;
}
}
// 读取并输出缓存文件
readfile({{LATEX:13}}post;
if (!{{LATEX:14}}post->post_type !== 'post') {
return;
}
{{LATEX:15}}post->ID;
{{LATEX:16}}post_id);
// 确保缓存目录可用
html_cache_ensure_directory();
// ==================== 场景1: 缓存有效 ====================
if (html_cache_is_valid({{LATEX:17}}cache_file)) {
// 缓存未过期,直接返回
html_cache_serve({{LATEX:18}}cache_file)) {
// 先返回旧缓存给用户(实现"先返回,后更新")
html_cache_serve({{LATEX:19}}lock_file = html_cache_get_lockpath({{LATEX:20}}lock_file) || (time() - filemtime({{LATEX:21}}lock_file);
// 使用wp-cron调度后台更新任务
if (!wp_next_scheduled('html_cache_regenerate', array({{LATEX:22}}post_id));
}
}
exit; // 重要:必须终止执行
}
// ==================== 场景3和4: 缓存不存在 ====================
// 手动生成缓存:加载模板并捕获输出
setup_postdata({{LATEX:23}}content = ob_get_clean();
// 保存到缓存文件(原子操作)
{{LATEX:24}}cache_file . '.tmp';
@file_put_contents({{LATEX:25}}content, LOCK_EX);
rename({{LATEX:26}}cache_file);
// 输出生成的内容并标记为MISS
header('X-Cache: MISS');
echo {{LATEX:27}}post_id) {
// 构建带随机参数的文章URL(避免被缓存)
{{LATEX:28}}post_id);
{{LATEX:29}}url);
// 发起非阻塞HTTP请求触发缓存生成
// timeout=0.01确保请求立即返回,不阻塞当前进程
wp_remote_get({{LATEX:30}}locks = glob(HTML_CACHE_DIR . '.lock_*');
if ({{LATEX:31}}locks as {{LATEX:32}}lock) > HTML_CACHE_LOCK_TTL * 2) {
@unlink($lock);
}
}
}
});
功能说明
-
三种场景完美实现:
- 缓存有效:直接返回静态文件(
X-Cache: HIT) - 缓存过期:先返回旧缓存,后台静默更新(
X-Cache: STALE) - 无缓存:实时生成,保存后返回(
X-Cache: MISS)
- 缓存有效:直接返回静态文件(
-
智能更新机制:
- 使用
wp-cron调度后台任务,PHP非阻塞请求实现异步更新 - 文件锁防止重复更新,5分钟有效期
- 使用
-
性能优化:
- 支持HTTP 304状态码,减少 bandwidth
- 添加
X-Cache头便于调试 - 文件原子写入,避免缓存损坏
-
安全保护:
- 自动生成
.htaccess禁止直接访问缓存目录 - 严格的后台更新验证
- 自动生成
登录后可参与表态
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!
推荐
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
领取 2000万 Tokens
通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力