thinkphp 6.1 不支持原生 ssr,所谓“缓存 ssr 页面”实为静态 html 缓存优化:通过 html 驱动缓存渲染后的完整页面,配合中间件自动拦截 get 请求并返回缓存文件,实现首屏秒开效果。

ThinkPHP 6.1 本身不直接支持 SSR(服务端渲染),它是一个 PHP 后端框架,主要用于生成 HTML 或提供 API,而非像 Node.js + Vue/Nuxt 那样做真正的客户端/服务端同构渲染。所谓“缓存 SSR 页面”,实际是指:对 ThinkPHP 渲染完成的完整 HTML 页面进行静态化缓存,使后续请求直接返回缓存的 HTML 文件,跳过控制器逻辑和模板渲染过程,达到类似 SSR 的首屏秒开效果。
这种方案常见于首页、分类页、商品列表页等内容更新频率低、访问量大的页面,属于「伪 SSR」优化手段,但实测有效、部署简单、兼容性强。
一、启用页面静态缓存功能
ThinkPHP 6.1 内置了 `html` 缓存驱动,需在配置中开启并指定缓存目录:// config/cache.php
'default' => 'html',
'stores' => [
'html' => [
'type' => 'html',
'path' => runtime_path('html'), // 缓存文件存放路径,如 ./runtime/html/
'prefix' => '',
'expire' => 3600, // 缓存有效期(秒),建议设为 1 小时或按业务调整
],
],
确保 runtime/html/ 目录存在且可写(Linux 下 chmod -R 755 runtime/html)。
二、在控制器中手动触发静态缓存
ThinkPHP 不会自动缓存所有页面,需显式调用 `Cache::tag()` + `html` 驱动写入 HTML 字符串,或更常用的是: ✅ **使用 `view()->fetch()` 获取渲染后 HTML,再写入静态文件**示例(首页缓存):
use think\facade\Cache;
use think\facade\View;
public function index()
{
$cacheKey = 'home_page_' . date('Ymd'); // 按天缓存,避免内容长期不更新
$html = Cache::store('html')->get($cacheKey);
if (false === $html) {
// 手动渲染模板,获取完整 HTML
$html = View::fetch('index', ['data' => $this->getHomeData()]);
// 写入静态缓存(注意:store('html') 会自动按 key 生成文件)
Cache::store('html')->set($cacheKey, $html, 3600);
}
return response($html)->contentType('text/html');
}
⚠️ 注意:View::fetch() 返回的是字符串,不是 Response 对象,适合做静态缓存;不要混用 return view() 和该方式。
三、配合路由与中间件实现自动缓存(推荐)
为减少侵入性,可封装一个中间件,在响应发出前判断是否命中缓存,并拦截后续执行:// app/middleware/HtmlCache.php
<?php namespace app\middleware;
use think\facade\Cache;
use think\Response;
class HtmlCache
{
public function handle($request, \Closure $next)
{
$key = 'html_' . md5($request->url(true));
$html = Cache::store('html')->get($key);
if (false !== $html && in_array($request->method(), ['GET', 'HEAD'])) {
return Response::create($html, 'html', 200);
}
$response = $next($request);
// 仅对 200 响应、HTML 类型、GET 请求做缓存
if ($response instanceof Response
&& $response->getCode() == 200
&& strpos($response->getHeader('Content-Type'), 'text/html') !== false
&& $request->isGet()) {
$htmlContent = $response->getContent();
Cache::store('html')->set($key, $htmlContent, 1800); // 半小时
}
return $response;
}
}
然后在路由或全局中间件中注册:
// route/app.php
Route::get('/', 'Index/index')->middleware(app\middleware\HtmlCache::class);
四、缓存更新与失效策略
静态缓存不能“永远不过期”,需结合业务主动刷新:- ✅ 定时任务清理旧缓存(如每天凌晨清空
runtime/html/下 24 小时前的文件) - ✅ 运营后台修改 Banner、商品分类后,调用
Cache::store('html')->delete('home_page_*')清除相关 key - ✅ 使用标签(Tag)管理缓存组(需自定义 html 驱动支持 tag,原生不支持,建议改用
file驱动 + 手动命名规范) - ✅ 关键页面(如促销页)可加版本号参数:
/home?v=20260922,自然绕过旧缓存
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











