最有效方式是用CDN分发静态资源,需统一静态路径、配置子域名、设置缓存规则、Nginx输出可信响应头、PHP动态适配CDN地址,并协同压缩与刷新策略。

直接用CDN分发静态资源,是PHP项目降低源站带宽压力最有效、最落地的方式。核心不是“挂个CNAME”,而是让CDN真正接管流量大头——图片、CSS、JS、字体这些占带宽80%以上的资源,必须从源站剥离、由边缘节点就近响应。
静态资源物理分离与CDN域名接入
CDN只认路径和域名,不认逻辑。所以第一步是把所有静态文件归到可预测的位置:
- 统一放在
/static/或/assets/目录下,避免散落在/uploads/、/themes/等非标准路径 - 更推荐用子域名方式隔离,比如
static.example.com,DNS加CNAME指向CDN提供的加速域名(如static.example.com.w.kunlungr.com) - 在CDN控制台添加该域名,回源填你PHP服务器的公网IP或主站域名(如
example.com),并强制HTTPS回源、开启“跟随302跳转” - 完成TXT验证后,在缓存规则里明确:
*.js, *.css, *.png, *.jpg, *.woff2, *.webp→ 缓存31536000秒(1年);*.php, /api/, /admin/, /index.php→ 不缓存
Nginx源头输出可信缓存头
光靠CDN设置不够,源站响应头必须配合,否则CDN可能因冲突头(如PHP框架自动加的no-cache)放弃缓存:
- 在Nginx配置中(如
/etc/nginx/conf.d/example.conf),添加独立location块: location ~* \.(js|css|png|jpg|gif|svg|woff2|ttf|eot|webp|pdf)$ { expires 1y; add_header Cache-Control "public, immutable"; add_header X-Content-Type-Options nosniff; try_files $uri =404; }- 执行
nginx -t && nginx -s reload重载,再用curl -I https://static.example.com/css/app.css确认返回头含Cache-Control: public, immutable
PHP代码中动态适配CDN路径
模板里写死/static/css/app.css等于绕过CDN。必须让输出自动带上CDN前缀:
立即学习“PHP免费学习笔记(深入)”;
- 在
.env中定义CDN_URL=https://static.example.com,PHP通过$_ENV['CDN_URL']读取(Laravel等框架支持原生加载) - 普通项目可在
config.php里写:define('CDN_URL', $_SERVER['APP_ENV'] === 'production' ? 'https://static.example.com' : '/static'); - 模板中统一调用:
<link rel="stylesheet" href="= CDN_URL ?>/css/app.css">,文章正文图片可用str_replace('src="/uploads/', 'src="'.CDN_URL.'/uploads/', $content)批量处理
动态内容不缓存 + 带宽协同压缩
CDN只减静态压力,PHP本身也要减少每请求的传输量:
- 在CDN后台严格排除
/api/、/user/、/admin/等路径,确保带Cookie或Session的请求100%回源 - Nginx启用Gzip:
gzip on; gzip_types text/plain text/css application/javascript text/xml application/xml application/xml+rss text/javascript; - PHP启用OPcache:
opcache.enable=1、opcache.memory_consumption=256,避免重复编译消耗CPU和带宽 - 图片上传时用GD或Imagick压缩:例如
imagejpeg($img, null, 75),前端用loading="lazy"延迟加载非首屏图
不复杂但容易忽略:每次更新JS/CSS后,别只刷新浏览器缓存——得去CDN控制台主动刷新对应路径,或改文件名(如app.a1b2c3.js)触发新缓存。这样源站带宽能降60%以上,首屏时间通常缩短一半。



















