无需ESI标签,如何在PHP中引入CDN缓存的完整URL HTML片段?
PHP实现外部HTML片段的CDN缓存(非ESI方式)
可以实现,但需要PHP配合CDN的缓存规则来操作,核心是把要缓存的HTML片段单独做成CDN可缓存的独立资源,再动态引入到PHP页面里,具体思路如下:
第一步:配置CDN缓存目标片段
先把https://www.example.org/abc.html这个页面配置成CDN可缓存的资源:给这个页面的响应头加上合适的缓存规则,比如设置Cache-Control: public, max-age=3600,让CDN识别到这是可以缓存的内容,后续请求直接返回CDN缓存的版本。第二步:在PHP页面中引入缓存片段
有两种常用的实现方式:- 直接请求并输出:用PHP的
file_get_contents()或者curl工具请求CDN缓存后的片段地址,然后把内容输出到当前页面中。示例代码:
要是服务器关闭了// 替换成你的CDN加速后的abc.html地址 $cached_fragment = file_get_contents('https://cdn.example.org/abc.html'); echo $cached_fragment;allow_url_fopen,就用curl替代:
记得加上异常处理,万一请求失败可以输出备用内容:$ch = curl_init('https://cdn.example.org/abc.html'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $cached_fragment = curl_exec($ch); curl_close($ch); echo $cached_fragment;$cached_url = 'https://cdn.example.org/abc.html'; $cached_fragment = @file_get_contents($cached_url); if ($cached_fragment === false) { echo '<div>加载失败,显示备用内容</div>'; } else { echo $cached_fragment; } - HTML标签嵌入:如果片段允许独立嵌套,可以用
<iframe>或者<object>标签直接引入,但这种方式会多一次HTTP请求,还可能有样式兼容问题,一般更推荐第一种方式。
- 直接请求并输出:用PHP的
关键注意点
- 要确保动态的PHP页面本身不被CDN缓存:给PHP页面的响应头设置
Cache-Control: private, no-cache,这样整个动态页面会实时生成,但其中的片段是CDN缓存好的静态内容。 - 目标片段的缓存规则要设置合理:比如根据内容更新频率调整
max-age的值,避免缓存过期后用户看不到最新内容。
- 要确保动态的PHP页面本身不被CDN缓存:给PHP页面的响应头设置
内容的提问来源于stack exchange,提问作者user2193480
相关产品推荐
相关产品推荐

