本文目录导读:

在 PHP 项目中压缩静态资源(CSS、JavaScript、图片等)主要有以下几种常用方法,从简单的手动操作到自动构建流程都有覆盖。
使用 PHP 库动态压缩
使用 Minify 库(推荐)
这是一个专门用于合并和压缩 CSS/JS 的 PHP 库。
安装:
composer require matthiasmullie/minify
使用示例:
require 'vendor/autoload.php';
use MatthiasMullie\Minify;
// 压缩 CSS
$minifier = new Minify\CSS('src/style.css');
$minifier->minify('dist/style.min.css');
// 压缩 JS
$minifier = new Minify\JS('src/script.js');
$minifier->minify('dist/script.min.js');
// 合并并压缩多个文件
$minifier = new Minify\CSS();
$minifier->add('src/style1.css');
$minifier->add('src/style2.css');
$minifier->minify('dist/combined.min.css');
使用 JShrink 压缩 JS
composer require tedivm/jshrink
use JShrink\Minifier; $js = 'var x = 1; var y = 2;'; $minifiedJS = Minifier::minify($js);
使用构建工具(推荐)
Gulp + PHP 项目
这是最灵活的方案,可以自动化整个流程。
安装 Gulp:
npm install -g gulp-cli npm init -y npm install gulp gulp-uglify gulp-clean-css gulp-concat gulp-imagemin --save-dev
gulpfile.js:
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const cleanCSS = require('gulp-clean-css');
const concat = require('gulp-concat');
const imagemin = require('gulp-imagemin');
// 压缩 JS
gulp.task('scripts', function() {
return gulp.src('src/js/**/*.js')
.pipe(concat('all.min.js'))
.pipe(uglify())
.pipe(gulp.dest('dist/js'));
});
// 压缩 CSS
gulp.task('styles', function() {
return gulp.src('src/css/**/*.css')
.pipe(concat('all.min.css'))
.pipe(cleanCSS())
.pipe(gulp.dest('dist/css'));
});
// 压缩图片
gulp.task('images', function() {
return gulp.src('src/images/**/*')
.pipe(imagemin())
.pipe(gulp.dest('dist/images'));
});
gulp.task('default', gulp.parallel('scripts', 'styles', 'images'));
Webpack(适用于前后端分离)
// webpack.config.js
module.exports = {
entry: './src/js/app.js',
output: {
filename: 'bundle.min.js',
path: path.resolve(__dirname, 'dist')
},
optimization: {
minimize: true
}
};
使用 CDN 和版本号
如果项目不大,可以手动压缩后添加版本号:
<!-- 在模板中 -->
<link rel="stylesheet" href="/css/style.min.css?v=<?= filemtime('css/style.min.css') ?>">
<script src="/js/script.min.js?v=<?= filemtime('js/script.min.js') ?>"></script>
使用在线压缩工具(简单项目)
- CSS/JS: https://www.minifier.org/
- 图片: https://tinypng.com/ 或 https://squoosh.app/
图片压缩优化
PHP 中使用 GD 库或 Imagick
// 使用 GD 库压缩图片
function compressImage($source, $destination, $quality = 80) {
$info = getimagesize($source);
if ($info['mime'] == 'image/jpeg') {
$image = imagecreatefromjpeg($source);
} elseif ($info['mime'] == 'image/png') {
$image = imagecreatefrompng($source);
imagepalettetotruecolor($image);
imagealphablending($image, true);
imagesavealpha($image, true);
}
imagejpeg($image, $destination, $quality);
}
使用第三方服务
// 使用 TinyPNG API
require_once("vendor/autoload.php");
\Tinify\setKey("YOUR_API_KEY");
$source = \Tinify\fromFile("input.png");
$source->toFile("output.png");
自动化部署方案
使用 Laravel Mix(适用于 Laravel 项目)
// webpack.mix.js
const mix = require('laravel-mix');
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.version(); // 添加版本号
使用 Docker + Nginx
在 Nginx 配置中添加 gzip:
server {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml;
gzip_min_length 1000;
gzip_comp_level 6;
}
推荐方案
根据项目规模选择:
- 小型项目: 使用在线工具 + PHP 库动态压缩
- 中型项目: Gulp/Webpack 自动化构建
- 大型项目: Laravel Mix + CDN + 版本控制
- 极致优化: 结合 Nginx gzip + 图片 CDN + Service Worker
最终建议:使用 Gulp 或 Laravel Mix 构建自动压缩流程,配合版本号防止缓存问题,这是性价比最高且维护性最好的方案。