thinkphp 5.0 的“静态缓存”专指页面缓存,即把渲染后的 html 保存为 .shtml 等静态文件以跳过 php 执行;真实静态资源(css/js/img)的缓存由 web 服务器(apache/nginx)通过 http 头控制,tp5.0 不参与。

ThinkPHP 5.0 的“静态缓存”不用于缓存前端静态资源(如 CSS、JS、图片),它专指服务端生成的 HTML 页面内容缓存为静态文件(即页面缓存 / 请求缓存),和浏览器或 CDN 缓存静态资源是两回事。
如果你的目标是让 *.css、*.js、*.png 等真实静态文件被浏览器高效缓存,TP5.0 本身不参与控制——这由 Web 服务器(Apache/Nginx)或 HTTP 响应头决定。但 TP5.0 可以配合实现动态页面输出的静态化,下面分两类讲清楚:
✅ 正确理解:TP5.0 的“静态缓存”是页面缓存,不是资源缓存
它把控制器执行后渲染出的 HTML 内容,保存成 .shtml 或其他后缀的物理文件(如 runtime/html/index_index.shtml),下次相同请求直接读取该文件,跳过 PHP 执行和模板渲染。
关键配置在 application/config.php 中:
'html_cache_on' => true, // 开启页面静态缓存
'html_cache_time' => 3600, // 全局缓存有效期(秒)
'html_file_suffix' => '.shtml', // 缓存文件后缀
'html_cache_rules' => [
'*' => ['{:module}/{:controller}/{:action}_{$_SERVER.REQUEST_URI|md5}'],
],
同时需在 application/tags.php 注册行为:
'view_filter' => ['app\home\behavior\WriteHtmlCacheBehavior'], 'app_init' => ['app\home\behavior\ReadHtmlCacheBehavior'],
⚠️ 注意:该机制依赖
app_debug => false,且只对GET请求生效;POST、带 session/cookie 差异的页面不适合。
? 如何真正缓存真实静态资源(CSS/JS/IMG)?
这些文件放在 public/static/ 下,由 Web 服务器直接响应,TP5.0 不经过路由和 PHP。要让浏览器长期缓存,需配置服务器返回合适的 Cache-Control 和 Expires 头。
Apache(.htaccess 示例):
<ifmodule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType text/javascript "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
</ifmodule>
Nginx(server 块内):
location ~* .(css|js|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
✅ 这样浏览器会复用本地副本,不发起请求,这才是“静态资源缓存”的正确做法。
? 补充:TP5.0 请求缓存(更推荐的现代方式)
相比老式页面缓存,Route::get(...)->cache(...) 更灵活、更可控,也属于“静态化输出”,但基于路由粒度:
// route/route.php
Route::get('article/:id', 'index/article/read')->cache(7200);
// 或带条件判断
Route::get('news/list', 'index/news/list')->cache(function() {
return input('page') ? ['expire'=>86400, 'tag'=>'news_page_'.input('page')] : false;
});
它同样生成 HTML 文件(默认在 runtime/request_cache/),但无需手动引入行为类,维护成本更低。
不复杂但容易忽略:静态资源缓存靠服务器,页面缓存靠 TP5.0 路由或行为机制,二者分工明确,混用反而失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











