要让thinkphp6稳定支撑1万并发静态页面访问,核心是将动态请求转为静态资源交付,由nginx直接返回html文件、绕过php解析;需启用html缓存、配置nginx优先读取static_cache目录下的.html文件、主动预热或事件驱动更新缓存,并关闭调试模式。

要让 ThinkPHP6 稳定支撑 1 万并发的静态页面访问,核心不是“打住”并发,而是**把动态请求彻底转为静态资源交付**,让 Nginx 直接返回 HTML 文件,完全绕过 PHP 解析。这本质上是“伪静态化”,但效果等同于纯静态站点。
一、确认并启用静态缓存机制
静态缓存必须显式开启,且仅对 GET 请求生效:
- 检查 config/app.php 或 .env,确保 HTML_CACHE_ON = true
- 设置合理有效期,例如 HTML_CACHE_TIME = 300(5 分钟),避免缓存过久导致内容陈旧
- 配置缓存路径,如 HTML_PATH = 'public/static_cache/'(建议放在 public 下,便于 Nginx 直接服务)
- 定义静态规则,例如:
'article:read' => ['{id}', 300] —— 表示 article 控制器的 read 操作按 id 生成 .html 文件,缓存 5 分钟
二、Nginx 配置:优先命中静态文件,不进 PHP
这是关键一步。Nginx 必须在转发给 PHP-FPM 前,先检查对应静态文件是否存在,并直接返回:
- 在 server 块中添加 location 匹配规则:
location ~ ^/article/read/(\d+)\.html$ {
try_files /static_cache/article_read_$1.html @php;
} - 或更通用方式(推荐):
location / {
try_files $uri /static_cache/$uri.html /index.php?$query_string;
}
这样所有 /xxx 路径会先查 public/static_cache/xxx.html,命中即返回,不走 PHP - 务必关闭静态文件的 PHP 解析(防止 .html 被当作脚本执行):
location ~ \.html$ {
add_header Content-Type text/html;
expires 5m;
}
三、缓存生成与更新策略
静态文件不能靠用户首次访问才生成(会卡住第一个请求),需主动预热或事件驱动更新:
- 数据变更时主动刷新:在文章更新逻辑末尾加
Cache::tag('article_' . $id)->clear();
file_put_contents(public_path() . '/static_cache/article_read_' . $id . '.html', $this->fetch('article/read')); - 热点页面定时预热(如首页、分类页):
使用 think schedule 每 10 分钟生成一次:
$schedule->call(function () {
file_put_contents(public_path() . '/static_cache/index.html', (new IndexController())->index());
})->everyTenMinutes(); - 禁用调试模式:APP_DEBUG = false,否则静态缓存不会生效
四、验证与压测要点
上线前必须实测静态路径是否真正被 Nginx 直接响应:
- 手动访问 https://yoursite.com/static_cache/article_read_123.html,查看响应头是否有 X-Powered-By: PHP —— 若有,说明仍经 PHP;若无且状态码 200、Content-Type text/html,说明成功直出
- 用 ab 或 wrk 压测该 .html 地址(非 /article/read/123),例如:
wrk -t4 -c1000 -d30s https://yoursite.com/static_cache/article_read_123.html - 观察服务器负载:CPU 应稳定在 20% 以下,内存无明显增长,QPS 轻松破万(取决于带宽和磁盘 I/O)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











