thinkphp本身不处理http缓存,真正起作用的是nginx层的配置;需分开设置静态资源(由nginx直接响应并强缓存)和php动态内容(用fastcgi_cache缓存html),二者配合才能高效应对高并发。

ThinkPHP本身不处理HTTP缓存,真正起作用的是Nginx层的配置。要让静态资源和PHP动态内容都高效缓存,得分开设置:静态文件走Nginx直接响应,PHP页面走FastCGI缓存,两者配合才能扛住高并发。
静态资源强制由Nginx缓存
所有CSS、JS、图片等文件,必须绕过PHP,由Nginx直接返回,并附带强缓存头。
- 在server块中添加location匹配规则,覆盖常见后缀:
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff2|ttf)$ - 设置长期缓存:
expires 1y;和add_header Cache-Control "public, immutable"; - 关闭这些路径的日志记录:
access_log off;,减少IO压力 - 确保
root指向public/目录,且public/static/、public/images/等子路径能被正确命中
PHP动态内容启用FastCGI缓存
对文章页、商品页等公开、无用户状态的PHP响应,用fastcgi_cache缓存HTML输出,避免重复执行框架逻辑。
- 在
http{}块顶部声明缓存区:fastcgi_cache_path /www/server/nginx/fastcgi_cache levels=1:2 keys_zone=phpcache:128m inactive=30m max_size=2g use_temp_path=off; - 手动创建并授权目录:
mkdir -p /www/server/nginx/fastcgi_cache && chown -R www:www /www/server/nginx/fastcgi_cache - 在PHP location块中启用缓存:
fastcgi_cache phpcache;、fastcgi_cache_valid 200 301 302 10m; - 关键三步不能少:忽略PHP返回的Cache-Control和Set-Cookie头(加
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;),缓存键稳定(推荐fastcgi_cache_key "$scheme$request_method$host$request_uri";),跳过敏感路径(如后台、登录页设set $skip_cache 1;)
ThinkPHP自身配合要点
框架不是旁观者,需主动“让出”缓存控制权,否则Nginx缓存会被干扰。
-
.env中必须设APP_DEBUG=false,禁用调试模式,否则会注入大量调试头和日志 - PHP代码里避免调用
header('Cache-Control: no-cache')或session_start()未关闭;如需session,立即跟session_write_close() - 路由层可启用内存级缓存:
'route_check_cache' => true(在config/app.php中),减少单请求内重复匹配开销 - 确保运行目录为
public/,且Nginx的root指向此处,防止误进app或config目录
验证与排查技巧
缓存是否生效,不能只看页面快慢,要看响应头和Nginx内置变量。
- 浏览器开发者工具中检查响应头:静态资源应有
Cache-Control: public, immutable,PHP页面应有X-FastCGI-Cache: HIT或MISS - 在Nginx日志中加入
$upstream_cache_status字段,实时观察缓存命中情况 - 若始终显示
BYPASS,重点查是否漏了fastcgi_ignore_headers,或PHP脚本输出了Set-Cookie - 用
curl -I URL快速比对首次与二次请求的Age和X-FastCGI-Cache值
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











