网站全静态化实现方式,这里提供的解决方法是在不改动原框架的实现方式,首先新增文件generate_static.php代码如下:
<?php
header('Content-Type: application/json');
// 获取前端传递的参数
$path = isset($_GET['path']) ? $_GET['path'] : '';
$force = isset($_GET['force']) && $_GET['force'] == '1';
if(empty($path)) {
echo json_encode(['code' => 400, 'msg' => '缺少URL参数']);
exit;
}
// 安全过滤:仅允许字母数字和斜杠
/*if(!preg_match('/^[a-z0-9\/\-]+\.html$/i', $path)) {
echo json_encode(['code' => 403, 'msg' => '非法URL格式']);
exit;
}*/
// 目标静态文件路径
$staticFile = __DIR__ . '/' . $path;
//判断是否是.html结尾不是则加上index.html
if(!preg_match('/\.html$/', $path)) {
$staticFile = __DIR__ . '/' . trim($path, '/') . '/index.html';
}
$staticDir = dirname($staticFile);
// 创建目录(如果不存在)
if(!is_dir($staticDir)) {
if(!mkdir($staticDir, 0755, true)) {
echo json_encode(['code' => 500, 'msg' => '目录创建失败']);
exit;
}
}
// 检查是否需要重新生成
$needGenerate = true;
if(file_exists($staticFile)) {
$fileTime = filemtime($staticFile);
$expireTime = 1800; // 30分钟有效期
// 检查是否在有效期内且没有强制更新
if((time() - $fileTime < $expireTime) && !$force) {
$needGenerate = false;
}
}
// 返回缓存文件(如果不需要重新生成)
if(!$needGenerate) {
echo json_encode([
'code' => 304,
'msg' => '缓存有效',
'path' => $path
]);
exit;
}
// 生成动态URL(使用当前域名)
$dynamicUrl = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://';
//请求地址改成动态请求地址
$dynamicUrl .= $_SERVER['HTTP_HOST'] . '/index.php?s=' . urlencode($path);
// 使用cURL获取动态内容(可以获取HTTP状态码)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $dynamicUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Static Cache Generator');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 10秒连接超时
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 30秒总超时
$content = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 检查HTTP状态码 - 仅缓存200响应
if($httpCode !== 200) {
$errorMsg = "动态内容获取失败 (HTTP {$httpCode})";
// 如果文件已存在但过期,返回现有文件路径
if(file_exists($staticFile)) {
echo json_encode([
'code' => 200,
'msg' => '使用过期缓存',
'path' => $path,
'warning' => $errorMsg
]);
exit;
}
echo json_encode([
'code' => 503,
'msg' => $errorMsg,
'http_code' => $httpCode
]);
exit;
}
// 检查内容是否有效
if(empty($content)) {
echo json_encode(['code' => 503, 'msg' => '动态内容为空']);
exit;
}
// 写入静态文件
if(file_put_contents($staticFile, $content) === false) {
echo json_encode(['code' => 500, 'msg' => '文件写入失败']);
exit;
}
// 返回成功响应
echo json_encode([
'code' => 200,
'msg' => '静态文件已生成',
'path' => $path,
'generated' => date('Y-m-d H:i:s')
]);然后在模板文件增加如下代码,触发生成静态文件
function generateStatic() {
// 通过js获取路径
var path = window.location.pathname;
// js获取force参数的值【增加是否强制更新缓存参数】
var force = getQueryVariable("force");
var q = {};
location.search.replace(/([^?&=]+)=([^&]+)/g,function(_,k,v){q[k]=v});
$.ajax({
url: '/generate_static.php',
type: 'GET',
data: {
path: path,
force: q.force // 可选强制更新参数
},
success: function(response) {
if(response.code === 200) {
console.log('生成成功:', response.path);
} else if(response.code === 304) {
console.log('使用缓存:', response.path);
} else {
console.error('错误:', response.msg);
}
}
});
}
// 页面加载时触发
$(document).ready(function() {
generateStatic();
});生成模板代码增加了30分钟的缓存时间,如果需要强制更新静态文件访问页面增加参数force=1即可
相关文章