最可靠方式是用filemtime()获取CSS文件最后修改时间戳作为版本号,需用绝对文件路径(如$_SERVER['DOCUMENT_ROOT'].'/css/style.css'),配合@抑制警告和?:time()兜底,并注意OPcache、文件权限及模板缓存问题。

直接用 filemtime() 读取 CSS 文件最后修改时间并拼进 <link> 的 href,是最简单、不依赖构建工具、上线即生效的方案。
为什么 filemtime() 比时间戳或随机数更靠谱
它只在 CSS 文件内容真正变化时才变,既不会像 ?t=<?php echo time(); ?> 那样每次请求都失效缓存,也不会像 ?v=1.2.3 那样漏更新——只要文件保存了,时间戳就更新。CDN 和浏览器都认这个 URL 变化。
- 必须用服务器上的绝对路径,比如
$_SERVER['DOCUMENT_ROOT'] . '/css/style.css',不能写'css/style.css' - 加
@抑制警告,避免文件不存在时输出 PHP 错误到 HTML 中 - 用
?: time()做兜底,防止权限问题或路径错误导致版本号恒为 0
PHP 模板里怎么安全写这行 <link>
别在 href 属性里直接嵌套函数调用,容易引号错位或转义失败。先算好变量,再塞进标签:
<?php $css_path = $_SERVER['DOCUMENT_ROOT'] . '/css/style.css'; $css_version = @filemtime($css_path) ?: time(); ?> <link rel="stylesheet" href="/css/style.css?v=<?php echo $css_version; ?>">
-
href里的路径保持为 Web 可访问的相对路径(如/css/style.css),和你在浏览器地址栏里能打开的一致 - 不要把
$css_path直接塞进href,那是服务器文件系统路径,浏览器打不开 - 如果 CSS 在子主题目录下(比如
/themes/blue/css/main.css),路径必须完整拼对,少一级就filemtime()返回false
上线后没更新?先查这三处
逻辑没错但没生效,大概率卡在环境细节上:
立即学习“PHP免费学习笔记(深入)”;
- OPcache 开启且
opcache.revalidate_freq = 0:PHP 脚本本身被缓存,filemtime()结果不会刷新——设成2或更高,或临时关 OPcache - Web 服务器没权限读 CSS 文件:检查
ls -l输出,确保运行 PHP 的用户(如www-data)有读取权限 - 模板被后端缓存了(比如 Smarty、Twig 启用了编译缓存):改完 PHP 模板后,清掉模板缓存目录再试
注意:filemtime() 解决的是“文件变了但浏览器不重载”的问题,它不解决 CDN 忽略查询参数的情况。如果用了 Cloudflare 免费版,默认勾选 “Ignore query string”,得去后台关掉,否则 ?v=xxx 根本传不到源站。



















