本文目录导读:

针对 PHP 网站的带宽优化,核心思路是 减少传输数据量、减少请求次数 以及 利用缓存,下面分几个层面,给出具体可落地的 PHP 带宽优化策略。
使用 Gzip / Brotli 压缩(最直接有效)
这是性价比最高的优化,启用压缩后,HTML、CSS、JS、JSON 的传输体积通常能减少 60-80%。
PHP 代码中实现(非 Nginx/Apache 层面):
// 在输出任何内容之前
ob_start("ob_gzhandler");
// 或者自定义压缩级别
ob_start(function($buffer) {
return gzencode($buffer, 9); // 9是最高压缩级别
});
更推荐的做法:在 Web 服务器层面统一开启(Nginx 举例):
gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css text/xml application/json application/javascript image/svg+xml;
注意: PHP 已输出压缩内容,服务器又重复压缩,会导致异常,建议在服务器层面统一处理,PHP 代码中不要重复开启。
图片优化(通常是流量大头)
PHP 生成或提供图片时,务必做压缩和格式转换。
1 自动转换为 WebP / AVIF
function getOptimizedImage($sourcePath) {
$info = getimagesize($sourcePath);
$mime = $info['mime'];
// 如果是 PNG/JPEG,尝试转换为 WebP(体积通常减少30-50%)
if ($mime == 'image/jpeg' || $mime == 'image/png') {
$im = imagecreatefromstring(file_get_contents($sourcePath));
$webpPath = $sourcePath . '.webp';
imagewebp($im, $webpPath, 80); // 80% 质量,平衡清晰度和大小
imagedestroy($im);
return $webpPath;
}
return $sourcePath;
}
2 使用 CDN + 图片处理服务
// 示例:七牛云/阿里云 OSS 图片处理 $imageUrl = "https://cdn.example.com/photo.jpg"; // 裁剪+压缩+格式转换 $optimizedUrl = $imageUrl . "?imageMogr2/auto-orient/format/webp/interlace/1/quality/80";
3 延迟加载(Lazy Load)
// 在模板中只输出占位图,真实图片用 data-src echo '<img src="placeholder.jpg" data-src="'.$realImage.'" loading="lazy" />'; // 配合 JavaScript 滚动时替换 src
HTTP 缓存策略(减少重复传输)
1 设置强缓存(Cache-Control + Expires)
$cacheTime = 60 * 60 * 24 * 30; // 30天
header("Cache-Control: public, max-age=$cacheTime");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $cacheTime) . " GMT");
2 静态资源版本控制(避免缓存失效问题)
// 文件修改后,URL 自动变化
echo '<link rel="stylesheet" href="/css/style.css?v=' . filemtime('/path/to/style.css') . '">';
// 或者使用内容哈希
echo '<script src="/js/app.js?v=' . md5_file('/path/to/app.js') . '"></script>';
3 条件请求(节省带宽,适合动态内容)
// 处理 If-None-Match / If-Modified-Since
$etag = md5($data); // 数据摘要
header("ETag: \"$etag\"");
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == "\"$etag\"") {
header("HTTP/1.1 304 Not Modified");
exit;
}
减少响应体大小
1 移除不必要的空白和注释(HTML 压缩)
function minifyHtml($buffer) {
$search = array(
'/\>[^\S ]+/s', // 移除标签后的空白
'/[^\S ]+\</s', // 移除标签前的空白
'/(\s)+/s', // 缩短连续空白
'/<!--(.|\s)*?-->/' // 移除 HTML 注释(可能破坏某些结构,慎用)
);
$replace = array('>', '<', '\\1', '');
return preg_replace($search, $replace, $buffer);
}
ob_start('minifyHtml');
2 JSON API 压缩(去除多余字段)
// 只返回必要的字段,避免传输无用数据
return response()->json([
'id' => $user->id,
'name' => $user->name,
// 不返回 profile_url, created_at 等非必要字段
]);
3 分页和懒加载(避免一次性传输大量数据)
// 使用 limit/offset 或 cursor 分页
$page = $_GET['page'] ?? 1;
$perPage = 20;
$offset = ($page - 1) * $perPage;
$items = $db->query("SELECT * FROM posts ORDER BY id LIMIT $perPage OFFSET $offset");
代码与业务逻辑优化
1 使用 Head 请求或字段裁剪
// 客户端只需要知道大小,不需要内容
if ($_SERVER['REQUEST_METHOD'] === 'HEAD') {
header("Content-Length: " . filesize($file));
exit;
}
2 数据库查询优化(减少不必要的数据拉取)
- 不要
SELECT *,只取需要的字段 - 使用延迟加载(Lazy Loading)避免即时加载关联模型
- 对大型数据集使用流式传输(yield / Generator)
3 使用 Varnish / Nginx FastCGI 缓存
将 PHP 生成的页面缓存到内存中,后续请求直接返回静态版本,完全绕过 PHP 处理。
# Nginx 配置示例
location ~ \.php$ {
fastcgi_cache VALID;
fastcgi_cache_valid 200 60m;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
}
高级技巧
1 合并小资源(CSS/JS Sprite)
// 将多个小 CSS/JS 合并为单个请求 // 生产环境建议使用工具(如 Laravel Mix / Webpack)自动打包
2 使用 CDN 分发静态资源
// 在配置文件中动态切换 CDN 域名
define('CDN_URL', ENVIRONMENT === 'production' ? 'https://cdn.example.com' : '/');
echo '<script src="'. CDN_URL .'/js/app.js"></script>';
3 异步加载非关键资源(defer/async)
echo '<script src="/js/analytics.js" async defer></script>';
优先级清单
| 优先级 | 措施 | 预计节省带宽 |
|---|---|---|
| 🔴 高 | 启用 Gzip/Brotli 压缩 | 60-80% |
| 🔴 高 | 图片转 WebP + 压缩 | 30-50% |
| 🟡 中 | 设置 HTTP 缓存头 | 大量减少重复请求 |
| 🟡 中 | HTML/JSON 最小化 | 10-30% |
| 🟢 低 | 资源合并、CDN、延迟加载 | 视情况而定 |
最后建议: 先用 Chrome DevTools 的 Network 面板或 PageSpeed Insights 分析当前页面体积和请求数,对症下药。启用压缩 + 图片优化 + 缓存 三步就能解决 80% 的带宽浪费问题。