PHP 动态页面配置 CDN 后加载慢,通常是因为源站响应头设置了禁止缓存(如 no-cache),导致请求频繁回源,或者源站本身性能不足。建议优先检查 HTTP 响应头缓存策略,并将静态资源与动态接口分离。
先说结论:CDN 对动态 PHP 页面加速效果有限,若未正确配置缓存规则或源站存在瓶颈,CDN 反而会增加回源延迟。
- 先定位:使用浏览器开发者工具或 curl 命令检查响应头是否包含 no-cache 或 Pragma 禁止缓存字段。
- 先做:修改 PHP 框架配置(如关闭 debug 模式)或 Nginx 配置,移除动态资源的禁止缓存头,静态资源设置长 TTL。
- 再验证:对比 CDN 域名与源站 IP 的 TTFB 时间,确认缓存命中率是否提升。
命令速用版
通过以下命令快速检查当前域名的缓存配置与回源情况:
curl -I https://your-domain.com/index.php
检查返回头中是否包含 Cache-Control: no-cache 或 Pragma: no-cache。若存在,CDN 节点将不会缓存该资源。对于 Nginx 源站,可尝试临时覆盖缓存头:
add_header Cache-Control "public, max-age=3600";
注意:动态页面需谨慎设置缓存,避免用户看到旧数据,建议仅对静态资源(css/js/img)应用此配置。
为什么会这样
CDN 加速依赖缓存命中,而 PHP 动态页面默认往往禁止缓存。当 CDN 节点无法缓存内容时,所有请求都会回源到源站,如果源站带宽不足或处理速度慢,CDN 增加的网络跳数反而会导致整体延迟增加。此外,若源站开启了调试模式(如 ThinkPHP 的 APP_DEBUG),可能会自动添加禁止缓存的响应头,导致 CDN 失效。
分步处理
第一步:检查并修正 HTTP 响应头
登录源站服务器,检查 Web 服务器(Nginx/Apache)或 PHP 代码中的缓存设置。若使用 ThinkPHP 框架,检查配置文件中是否设置了 SESSION_AUTO_START 或 APP_DEBUG 为 true,这些选项可能导致自动添加 Pragma: no-cache。建议将 APP_DEBUG 设置为 false,并手动配置 HTTP_CACHE_CONTROL 为 public。
第二步:动静分离配置
将图片、CSS、JS 等静态资源通过 CDN 域名访问,动态 PHP 接口通过独立域名或直接回源。在 CDN 控制台设置缓存规则,对静态文件后缀(如 .css, .js, .png)设置较长的 TTL(如 7 天),对 .php 文件设置不缓存或短 TTL。
第三步:优化源站性能
确保源站带宽充足,避免回源风暴。启用 HTTP/2 协议减少握手开销,特别是 HTTPS 场景下。若源站 CPU 或带宽跑满,需扩容服务器或增加负载均衡。
怎么验证是否生效
使用浏览器开发者工具(F12)的 Network 面板,查看资源加载的 Timing。若 CDN 生效,静态资源的 Size 栏应显示 memory cache 或 disk cache,且 TTFB(Time To First Byte)时间显著低于直连源站。也可使用 Ping 工具分别测试 CDN 域名和源站 IP,若 CDN 域名延迟更低且稳定,说明调度正常。监控 CDN 控制台的缓存命中率,若低于 90% 需检查缓存规则。
常见坑
1. CNAME 配置错误:域名未正确解析到 CDN 提供的 CNAME 地址,导致请求直接回源或报错。
2. HTTPS 证书问题:CDN 节点证书过期或与域名不匹配,导致 SSL 握手失败或延迟增加。
3. WAF 误拦截:源站或 CDN 的 Web 应用防火墙规则过严,将正常请求误判为攻击并拦截,导致请求超时。
4. 跨运营商回源:源站线路单一,CDN 节点回源时跨越运营商(如联通回源电信),产生高延迟。
常见问题
动态 PHP 页面能被 CDN 缓存吗?
可以,但需要配置动态加速规则。普通 CDN 默认不缓存动态内容,需使用全站加速产品或手动设置特定 URL 的缓存策略,注意避免缓存用户私密数据。
ThinkPHP 项目配置 CDN 后为什么还是慢?
常见原因是框架调试模式未关闭,导致响应头包含 no-cache。检查 APP_DEBUG 是否为 false,并确认静态资源路径是否正确指向 CDN 域名。
如何判断是 CDN 问题还是源站问题?
在相同网络环境下,分别访问 CDN 域名和源站 IP。若直连源站速度快于 CDN,且直连稳定,通常是 CDN 节点调度或配置问题;若直连也慢,则是源站性能瓶颈。
参考来源
- CDN 加速为什么很慢?CDN 加速慢怎么办
- 用了 CDN 反而更慢怎么回事?CDN 加速效果差原因分析
- thinkphp 开发的网站配置 cdn 后仍然很慢原因一解
- 关于为啥使用 Cdn 加载速度会更慢的问题?
- 网站部署 CDN 后访问速度还是很慢要怎么处理?