1.
概述:PHP 网站能否使用静态 CDN 加速?
说明:能。静态 CDN 主要用于分发 CSS、JS、图片、字体、视频等静态文件,减少源站负载与延迟。
要点:将静态资源放到 CDN 可访问路径或存储服务(如 S3),并在 PHP 中引用 CDN URL 或通过函数自动替换资源前缀。
2.
准备工作:域名与 CDN 服务选择
步骤:1) 选择 CDN 提供商(CloudFront、阿里云 CDN、七牛、Cloudflare 等)。2) 为 CDN 创建子域名,如 static.example.com。3) 在 DNS(域名管理)中添加 CNAME 指向 CDN 提供商给出的地址。
备注:如果使用 S3 + CloudFront,需在 S3 中开启静态网站托管或作为 CloudFront 的 Origin。
3.
上传静态资源到源站(示例:S3)
具体:1) 在 AWS S3 新建 bucket,设置权限为私有或按需求。2) 上传 /css、/js、/images 等目录文件。3) 配置 bucket 的 CORS(允许跨域请求),示例允许 GET。
CORS 示例:允许来源为 your site 或 *,方法 GET、HEAD。
4.
配置 CDN(以 CloudFront 为例)
操作:1) 在 CloudFront 创建分配(Distribution),Origin 指向 S3 或你的源站域名。2) 配置缓存策略:设置较长的 TTL(如 86400)用于静态资源。3) 配置自定义域名(static.example.com)并上传证书(ACM)。
测试:等待分配部署完成后,访问 https://static.example.com/path/to/file 检查是否能访问并返回 200。
5.
在 PHP 中接入:统一资源前缀方法
思路:在 PHP 项目中不要写硬编码的相对路径,而是通过一个 helper 函数拼接 CDN 前缀。示例代码:
<?php
function asset_url($path){
// 从配置读取 CDN 域名,开发环境可为空
$cdn = defined('CDN_URL') ? CDN_URL : '';
$version = 'v=20260414'; // 可用文件哈希替换
return rtrim($cdn,'/').'/'.ltrim($path,'/').'?'.$version;
}
// 用法:<link href="<?=asset_url('css/app.css')?>" rel="stylesheet">
?>
小提示:在本地或调试环境可设置 CDN_URL 为空以回退到本地。
6.
自动化版本控制:避免缓存问题
做法:1) 构建时为静态文件附加 hash(例如 app.abcdef.css)或在 URL 添加版本 query(?v=hash)。2) 在部署脚本中生成 manifest.json 映射原始名到带 hash 的文件名。
PHP 获取:读取 manifest 并在 asset_url 中替换真实文件名,确保每次发布资源变更都会产生新的 URL。
7.
Web 服务器配置:Cache-Control 与压缩
建议:在源站或 CDN 设置正确的 Cache-Control(例如 max-age=31536000, immutable 对于带 hash 的文件),并开启 Gzip/Brotli 压缩 JS/CSS。
Nginx 片段示例:
location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?)$ {
expires 365d;
add_header Cache-Control "public, max-age=31536000, immutable";
gzip on;
}
8.
回退策略:CDN 不可用时的处理
方法:1) 在 PHP 中检测 CDN_URL 是否可用(可选每分钟检测),若不可用则输出本地资源 URL。2) HTML 中使用双路径加载:先加载 CDN,失败时用 JS 动态替换为本地。
简易 JS 回退示例:
var img = new Image(); img.onerror = function(){document.getElementById('logo').src='/images/logo.png';}; img.src='https://static.example.com/images/logo.png';
9.
实践案例:从 Apache + PHP 到 S3+CloudFront 的迁移步骤
步骤:1) 将 /public 下的静态文件上传到 S3 的同路径。2) 在 CloudFront 创建 Distribution 指向 S3。3) 在应用配置中把静态前缀改为 https://static.example.com。4) 在部署脚本中同步静态文件并更新 manifest。
测试:访问页面,打开 Network 面板确认静态文件来自 static.example.com 并带有 CDN 响应头。
10.
性能与 SEO 注意点
要点:1) 确认资源使用正确的 Content-Type 与缓存头。2) 对关键 CSS 使用 inline 或 preload,避免首屏闪烁。3) 图片使用 WebP/AVIF 并启用懒加载以优化 LCP。
SEO:静态资源域名做 CNAME 时确保 robots 不屏蔽资源,且不要把重要内容(HTML)放入 CDN 静态路径。
11.
示例:完整 PHP 模板引入静态资源
示例:
<?php define('CDN_URL','https://static.example.com'); ?>
<link rel="preload" href="<?=asset_url('css/app.css')?>" as="style">
<link rel="stylesheet" href="<?=asset_url('css/app.css')?>">
<script src="<?=asset_url('js/app.js')?>" defer></script>
说明:使用 preload 加速关键 CSS,使用 defer 加载 JS。
12.
常见问题与排查步骤
排查清单:1) CDN 是否已完成 DNS CNAME 解析?2) 访问 static 域名是否返回 200?3) 是否设置了正确的 Cache-Control 与 CORS?4) 浏览器控制台中资源是否跨域失败?
13.
问:PHP 项目把所有静态资源一律走 CDN 有副作用吗?
答:不建议把 HTML 页面走纯静态 CDN(除非做全站静态化),因为动态 HTML 需要即时生成。静态资源如图片、CSS、JS、字体适合走 CDN。同时注意第三方 cookie/跨域问题与缓存失效策略。
14.
问:如何在 PHP 中切换 CDN 开关用于本地开发?
答:在配置文件中使用环境变量(如 APP_ENV 或 USE_CDN),在 asset_url 函数中根据该配置返回 CDN 或本地路径。开发环境把 CDN_URL 设为空或指向本地模拟服务。
15.
问:如果 CDN 上的文件更新后,浏览器还在加载旧文件怎么办?
答:应采用版本化文件名(hash)或在 URL 上附加版本参数。发布脚本生成新 hash 并更新模板或 manifest,CDN 清理/失效(invalidation)也可在发布时触发以立即生效。