我有一个在云服务器中运行的 php 站点。每当我添加新文件 css、js 或图像时,浏览器都会加载存储在缓存中的相同的旧 js、css 和图像文件。
我的网站有一个文档类型和元标记,如下所示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)">
<meta http-equiv="Page-Exit" content="blendTrans(Duration=1.0)">
<meta http-equiv="Site-Enter" content="blendTrans(Duration=1.0)">
<meta http-equiv="Site-Exit" content="blendTrans(Duration=1.0)">
由于上述文档类型和元代码,我是否加载了缓存在浏览器中的相同文件而不是新文件
No Cache in all Browsers
。您还可以对不想缓存的文件执行 ?randomGeneratedNumber。
尝试这个
<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
在这里,如果您想通过 HTML 控制它:请执行以下选项 1:
<meta http-equiv="expires" content="Sun, 01 Jan 2014 00:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache" />
如果你想通过 PHP 控制它:像下面的选项 2 那样做:
header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
并且选项 2 总是更好,以避免基于代理的缓存问题。
你可以试试这个:
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Connection: close");
希望它有助于防止缓存,如果有的话!
我在缓存我的 css 文件时遇到了问题。在 PHP 中设置标题对我没有帮助(可能是因为需要在样式表文件中设置标题,而不是在链接到它的页面中设置?)。
我在此页面上找到了解决方案:https://css-tricks.com/can-we-prevent-css-caching/
解决方案:
附加时间戳作为链接文件的 URI 的查询部分。 (可用于css、js、图片等)
对于开发:
<link rel="stylesheet" href="style.css?<?php echo date('Y-m-d_H:i:s'); ?>">
对于生产(缓存主要是一件好事):
<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(并在需要时手动重写)
或这两者的组合:
<?php
define( "DEBUGGING", true ); // or false in production enviroment
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo (DEBUGGING) ? date('_Y-m-d_H:i:s') : ""; ?>">
编辑:
或者这两者的更漂亮的组合:
<?php
// Init
define( "DEBUGGING", true ); // or false in production enviroment
// Functions
function get_cache_prevent_string( $always = false ) {
return (DEBUGGING || $always) ? date('_Y-m-d_H:i:s') : "";
}
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo get_cache_prevent_string(); ?>">
视情况而定,防止浏览器缓存不是一个好主意。寻找解决方案我找到了这样的解决方案:
<link rel="stylesheet" type="text/css" href="meu.css?v=<?=filemtime($file);?>">
这里的问题是,如果文件在服务器上的更新期间被覆盖,这是我的场景,缓存将被忽略,因为时间戳被修改,即使文件的内容相同。
我使用此解决方案强制浏览器仅在其内容被修改时才下载资产:
<link rel="stylesheet" type="text/css" href="meu.css?v=<?=hash_file('md5', $file);?>">
stat
电话。没有文件系统缓存,16ns,顶级?带缓存,可靠 < 8ns。纳秒。在我的系统上,MD5 可以处理 754 MiB/s 而不会闪烁。 (openssl speed md5
) 组合起来,一个 100KB 的 CSS 文件将有一个组合的额外开销……129µs(微秒,0.1295ms)+ 8ns(对最终数字没有有意义的贡献)= 129µs。
hash_file('md5', $deployment_counter)
或 hash_file('md5', $cache_clear_counter)
是首先想到的。
您还可以对缓存文件使用查询字符串。它不会影响您的样式和 js 文件的行为。
例如:
example.com/mystyle.css ->
example.com/mystyle.css?<?php echo random(1000, 5000); ?>
session_start()
,它将用Cache-Control: private, max-age=10800, pre-check=10800
覆盖您的标题,因为 180 分钟是session.cache_expire
的默认值。如果无法避免启动会话,但需要禁用缓存,请使用session_cache_limiter('private');session_cache_expire(0);
。header
函数的第二个参数是 replace 的 boolean。可选的 replace 参数指示该标头是否应该替换先前的类似标头,或者添加第二个相同类型的标头。