本文目录导读:

在PHP项目中配置静态资源压缩,主要目的是为了加快页面加载速度,减少带宽消耗,以下是几种常见的配置方法,从服务器层面到代码层面,可以根据项目环境选择。
服务器级别压缩(推荐,性能最高)
Nginx 配置
在 Nginx 配置文件的 server 块或 location 块中添加:
# 开启 gzip 压缩 gzip on; gzip_min_length 1k; # 文件大于1KB才压缩 gzip_comp_level 6; # 压缩级别 1-9,6是推荐平衡值 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml font/ttf font/opentype application/vnd.ms-fontobject; gzip_vary on; gzip_proxied any; gzip_disable "msie6"; gzip_buffers 16 8k; gzip_http_version 1.1;
Apache 配置
在 .htaccess 或 httpd.conf 中启用 mod_deflate:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json application/xml image/svg+xml
# 排除浏览器
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 设置压缩级别
DeflateCompressionLevel 6
# 设置缓冲
DeflateBufferSize 8192
</IfModule>
PHP 代码层面压缩
通用压缩函数
在 PHP 代码中通过 ob_gzhandler 实现:
<?php
/**
* 开启输出压缩
*/
function enableCompression() {
// 检测浏览器是否支持 gzip
if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) {
// 开启输出压缩,级别为6
@ini_set('zlib.output_compression', 'On');
@ini_set('zlib.output_compression_level', '6');
}
}
// 在页面输出前调用
enableCompression();
// 或者使用 ob_gzhandler
ob_start('ob_gzhandler');
?>
针对静态资源的压缩
专门处理 CSS/JS 文件的压缩函数:
<?php
function compressStaticFile($filePath, $type = 'css') {
$content = file_get_contents($filePath);
if ($type === 'css') {
// CSS 压缩:移除注释、空格、换行
$content = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $content);
$content = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $content);
$content = preg_replace('/\s*([{}|:;,])\s+/', '$1', $content);
$content = preg_replace('/\s+/', ' ', $content);
} elseif ($type === 'js') {
// JS 基础压缩(建议使用专业工具)
$content = preg_replace('/\/\/[^\n]*/', '', $content);
$content = preg_replace('/\/\*.*?\*\//s', '', $content);
$content = str_replace(array("\r\n", "\r", "\n", "\t"), '', $content);
}
return $content;
}
// 使用示例
header('Content-Type: text/css');
echo compressStaticFile('/path/to/style.css', 'css');
使用 PHP 缓存类管理压缩
<?php
class StaticCompressor {
private $cacheDir = '/tmp/static_cache/';
private $compressLevel = 6;
public function __construct() {
if (!is_dir($this->cacheDir)) {
mkdir($this->cacheDir, 0755, true);
}
}
/**
* 压缩并缓存静态文件
*/
public function compress($filePath, $type) {
$cacheKey = md5($filePath . filemtime($filePath));
$cacheFile = $this->cacheDir . $cacheKey . '.' . $type . '.gz';
// 检查缓存
if (file_exists($cacheFile)) {
return file_get_contents($cacheFile);
}
// 读取原文件
$content = file_get_contents($filePath);
// 根据类型压缩
if ($type === 'css') {
$content = $this->compressCSS($content);
} elseif ($type === 'js') {
$content = $this->compressJS($content);
}
// 压缩并缓存
$compressed = gzencode($content, $this->compressLevel);
file_put_contents($cacheFile, $compressed);
return $compressed;
}
private function compressCSS($content) {
$content = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $content);
$content = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $content);
return $content;
}
private function compressJS($content) {
// 使用外部工具如 uglifyjs 或 terser
// 此处简化处理
return $content;
}
/**
* 输出压缩后的静态资源
*/
public function output($filePath, $type) {
$content = $this->compress($filePath, $type);
// 设置响应头
header('Content-Encoding: gzip');
header('Content-Type: ' . ($type === 'css' ? 'text/css' : 'application/javascript'));
header('Content-Length: ' . strlen($content));
header('Cache-Control: public, max-age=86400');
header('Vary: Accept-Encoding');
echo $content;
exit;
}
}
// 使用示例
$compressor = new StaticCompressor();
// 在路由中处理 /compress/css/style.css 请求
// $compressor->output('/path/to/style.css', 'css');
?>
结合 Webpack 或 Gulp 进行构建时压缩(推荐)
项目构建配置(package.json)
{
"scripts": {
"build": "webpack --mode production",
"compress": "uglifyjs-folder js -o js.min --each '*.js' --pattern '**/*.js' && cleancss css/*.css -o css.min/"
}
}
然后在 PHP 中调用构建后的压缩文件:
<?php
function loadCompressedAssets() {
$manifest = json_decode(file_get_contents(__DIR__ . '/build/manifest.json'), true);
return [
'css' => $manifest['main.css'],
'js' => $manifest['main.js']
];
}
$assets = loadCompressedAssets();
echo '<link rel="stylesheet" href="' . $assets['css'] . '">';
echo '<script src="' . $assets['js'] . '"></script>';
?>
使用第三方库
Install via Composer
composer require matthiasmullie/minify
使用示例
<?php
use MatthiasMullie\Minify;
// CSS 压缩
$minifier = new Minify\CSS('/path/to/style.css');
$minifier->add('/path/to/other.css');
$minifier->minify('/path/to/output.css');
// JS 压缩
$minifier = new Minify\JS('/path/to/script.js');
$minifier->minify('/path/to/output.js');
// 在运行时压缩并输出
header('Content-Type: text/css');
$minifier = new Minify\CSS();
$minifier->add(file_get_contents('style1.css'));
$minifier->add(file_get_contents('style2.css'));
echo $minifier->minify();
?>
最佳实践
- 优先级:服务器层压缩(Nginx/Apache)> 构建工具压缩 > PHP代码压缩
- 缓存策略:使用适当的 HTTP 缓存头,减少重复压缩
- 监控:使用浏览器开发者工具的 Network 面板检查
Content-Encoding: gzip - 测试:压缩后要对功能进行完整测试,特别是 JavaScript
- 安全:确保压缩工具不会引入安全漏洞,定期更新依赖
推荐方案:服务器级压缩 + 构建工具预压缩,这样既高效又稳定,PHP只需负责读取已压缩的文件即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播