本文目录导读:

在 PHP 中实现静态资源版本控制,主要有以下几种常见方案,从简单到进阶:
手动版本号(最简单)
在 HTML 或 PHP 中手动添加版本号:
<link rel="stylesheet" href="style.css?v=1.0.1"> <script src="app.js?v=1.0.1"></script>
缺点:需要手动维护,容易忘记更新。
文件时间戳(自动版本)
利用 PHP 获取文件修改时间作为版本号:
<?php
function asset($file) {
$path = $_SERVER['DOCUMENT_ROOT'] . '/' . $file;
$version = filemtime($path); // 获取文件修改时间戳
return '/' . $file . '?v=' . $version;
}
?>
<link rel="stylesheet" href="<?php echo asset('css/style.css'); ?>">
<script src="<?php echo asset('js/app.js'); ?>"></script>
优点:自动更新,文件修改后版本号自动变化。
MD5 哈希(内容唯一)
生成哈希值:
function asset_hash($file) {
$path = $_SERVER['DOCUMENT_ROOT'] . '/' . $file;
if (file_exists($path)) {
$hash = md5_file($path); // 文件内容哈希
return '/' . $file . '?v=' . substr($hash, 0, 8);
}
return '/' . $file;
}
优点变化才更新,更精准。
配置文件管理(集中管理)
创建配置文件统一管理版本:
// config/assets.php
return [
'css/app.css' => '1.0.3',
'js/app.js' => '2.1.0',
];
使用:
<?php
// 加载配置
$assets = require 'config/assets.php';
function asset($file, $assets) {
$version = $assets[$file] ?? '1.0.0';
return '/' . $file . '?v=' . $version;
}
?>
<link rel="stylesheet" href="<?php echo asset('css/app.css', $assets); ?>">
构建工具自动生成(推荐)
使用构建工具(如 Gulp、Webpack)自动生成带版本的静态资源:
Gulp 示例:
// gulpfile.js
const gulp = require('gulp');
const rev = require('gulp-rev');
const revCollector = require('gulp-rev-collector');
// 1. 给文件添加 hash 后缀
gulp.task('rev', function() {
return gulp.src('src/**/*.{css,js}')
.pipe(rev())
.pipe(gulp.dest('dist'))
.pipe(rev.manifest())
.pipe(gulp.dest('dist'));
});
// 2. 生成 manifest.json
gulp.task('collect', function() {
return gulp.src(['dist/manifest.json', 'templates/**/*.php'])
.pipe(revCollector())
.pipe(gulp.dest('templates'));
});
生成的 manifest 文件:
{
"css/style.css": "css/style-8a9b7c6d.css",
"js/app.js": "js/app-3e4f5a6b.js"
}
Composer 包方案
使用 PHP 包管理器安装现成方案:
composer require illuminate/filesystem
use Illuminate\Filesystem\Filesystem; $files = new Filesystem(); $version = $files->hash($filePath); // 自动计算哈希
最佳实践建议
- 开发环境:使用时间戳方案,确保每次修改都能及时更新
- 生产环境:使用 MD5 哈希或构建工具,减少请求
- CDN 集成:版本号可以帮助 CDN 缓存刷新
补充分支方案:
// 结合环境判断
function asset_dev($file) {
if (getenv('APP_ENV') === 'production') {
return asset_hash($file); // 生产用 hash
}
return '/' . $file . '?time=' . filemtime($file); // 开发用时间戳
}
选择哪种方案取决于项目复杂度,小项目用方案 2 或 3 就够了,大项目建议用构建工具自动处理。