PHPCDN缓存与本地缓存是分层协作关系,非二选一:PHPCDN缓存HTTP响应体(如静态资源、伪静态HTML、公开API),本地缓存处理用户上下文、数据库结果、模板片段等动态数据,二者通过HTTP头协同控制缓存生命周期与失效。

PHPCDN 缓存和本地缓存不是二选一,而是分层协作
PHPCDN(如腾讯云 CDN、又拍云 PHP 加速节点)本质是反向代理层,它缓存的是 HTTP 响应体(HTML/JSON/JS/CSS 等),不执行 PHP;而本地缓存(如 apcu、redis、file_get_contents 临时文件)运行在 PHP 进程内,可缓存数据库查询结果、配置数组、渲染中间态等。二者职责不同,强行让 PHPCDN 缓存动态 PHP 输出(比如带用户信息的页面)会导致缓存污染或泄露。
哪些内容该交给 PHPCDN 缓存
PHPCDN 只适合缓存「静态化输出」或「强一致性要求低」的内容:
-
前端资源:
/static/js/app.js、/images/logo.png—— 配置Cache-Control: public, max-age=31536000 - 伪静态页面:
/article/123.html(由 PHP 渲染后生成 HTML 文件并写入./html/目录)—— PHPCDN 缓存该 HTML 文件,不回源 - API 接口(仅限公开数据):
/api/v1/public/news,响应头加Cache-Control: public, s-maxage=600,让 PHPCDN 缓存 10 分钟 - 避免缓存含 Cookie / Authorization 的请求:PHPCDN 默认忽略这些请求头做缓存键,但若业务误配了
Cache-Key规则,可能把用户 A 的响应返回给用户 B
哪些内容必须用本地缓存兜底
所有涉及用户上下文、实时状态、高频读写的数据,不能依赖 PHPCDN:
- 用户会话数据:
$_SESSION存在redis或memcached,而非靠 PHPCDN 缓存登录态 HTML - 数据库查询结果:
apcu_fetch('user_profile_456')比反复查 MySQL 快一个数量级;PHPCDN 完全看不到这个层面 - 模板片段缓存:用
ob_start()+apcu_store()缓存某段渲染逻辑的输出,下次直接apcu_fetch()返回,不走完整 MVC 流程 - 配置热加载:将
config.php解析后存入apcu,避免每次请求都include+ 解析,PHPCDN 对此无感知
协同关键:用 HTTP 头控制缓存层级与失效
PHPCDN 和本地缓存之间没有直接通信机制,靠 HTTP 协议头协调行为:
立即学习“PHP免费学习笔记(深入)”;
- PHP 脚本中用
header('X-Accel-Expires: 300')(Nginx)或header('X-Cache-TTL: 300')(部分 CDN)显式告诉 PHPCDN 缓存时长 - 需要强制刷新 PHPCDN 缓存时,调用 CDN 提供的 API 或控制台提交
/api/v1/user/456的 Purge 请求,不影响本地apcu中的其他 key - 本地缓存失效要主动触发:用户修改资料后,立刻
apcu_delete('user_profile_456'),而不是等 PHPCDN 过期再“自然更新” - 慎用
Cache-Control: no-cache:它只禁止 PHPCDN 缓存,但不阻止本地缓存生效;真正要跳过所有缓存,得同时apcu_delete()+header('Cache-Control: no-store')











