ChatGPT解决这个技术问题 Extra ChatGPT

如何防止php站点的浏览器缓存

我有一个在云服务器中运行的 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。
您可能不想完全禁用图像 /js / css 的缓存:stackoverflow.com/questions/4206224/…
抵制死灵的诱惑,但请任何考虑这个的人:停止。学会控制和使用缓存,不要因为一个不方便的情节就盲目地禁用它。阅读 HTTP The Definitive Guide 中关于缓存的章节 — 这本书(和 RFC)应该是强制性阅读,并带有测试。了解如何指定 Last-Modified、响应 If-Modified-Since 以及利用 ETag 标识。然后,当资产更新时,浏览器将在 304 再次变为 200 时收到通知。
99.999999999999999999999999999% 的请求中的“不方便的插曲”。

C
Codesen

尝试这个

<?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");
?>

除了“max-age=0”,这些是 PHP 发送的标头,没有在我的安装中指定上述内容。似乎 PHP 试图默认阻止浏览器缓存...
我有一个 WordPress 插件,它向旧版本的 Internet Explorer 发送一个替代主题,它在某些缓存系统上被严重绊倒。这篇文章出现在我的第一次谷歌搜索中。打的好。
请记住,这不能嵌入到 html 中;这应该在页面的最顶部。
注意:如果您之后使用 session_start(),它将用 Cache-Control: private, max-age=10800, pre-check=10800 覆盖您的标题,因为 180 分钟是 session.cache_expire 的默认值。如果无法避免启动会话,但需要禁用缓存,请使用 session_cache_limiter('private');session_cache_expire(0);
@thdoan header 函数的第二个参数是 replaceboolean。可选的 replace 参数指示该标头是否应该替换先前的类似标头,或者添加第二个相同类型的标头。
R
Ritesh Aryal

在这里,如果您想通过 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 总是更好,以避免基于代理的缓存问题。


A
Aakanksha

你可以试试这个:

    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");

希望它有助于防止缓存,如果有的话!


这仅与 HTML 文件的缓存有关吗?和eTag无关?谢谢!
只要第一行就足够了。第 5 行实际上是完全错误的,与服务器响应无关(它是请求标头)。第六行无论如何都没有影响。我可以继续...
霰弹枪方法:把所有东西都扔到墙上,希望有东西能粘住。根据我对问题本身的评论,我强烈建议您获取 HTTP: The Definitive Guide 的副本并阅读有关缓存的章节。还有 RFC,但阅读这些是一项独特的技能。 (“连接:关闭”是一个有趣的脚注,包括禁用有效的请求流水线,或者什么也不做,但我怀疑 PHP 可能真的让它通过。)
L
Lukas

我在缓存我的 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(); ?>">

任意版本,当前时间戳(完全击败缓存)......但不是真正有意义和有效的一件事,无论是否有“调试”标志。你为什么不使用文件的实际 mtime ?然后,您实际上永远不需要更新 PHP,缓存也不会变得完全无用。或者只是使用正确配置的 HTTP 服务器(如 Nginx 或 Apache)来提供您的静态数据,该服务器设置了正确的 Last-Modified 和 ETag。同样,这种类型的“调试”标志已经存在……在浏览器中。 (禁用缓存、不使用缓存刷新、清空缓存……)
i
ismavolk

视情况而定,防止浏览器缓存不是一个好主意。寻找解决方案我找到了这样的解决方案:

<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);?>">

哎呀!如果总是在主线程中加载所有 CSS/JS 文件以检查它们的大小/散列,这对于性能和可伸缩性来说是很糟糕的。
@Dalin 在您流下 Gentoo ricer 的眼泪之前(一个以“快速”而闻名的 Linux 发行版,通过从源代码和架构进行过度编译而闻名),我会打一个 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) 是首先想到的。
@Dalin 所以......从磁盘(最终内核 VFS 缓存)流式传输整个文件以在每次访问时重新散列它?即使mtime没有改变? “在之前”,哈希缓存被扔进了这个“解决方案”……只是离 HTTP 标准缓存机制更远了。我知道我提到了散列,但这绝对是过度的。请参阅第 7 节(缓存),有关具体详细信息,请参阅 HTTP: The Definitive Guide 的第 1.8.2 节、第 3.5.1.1 节、第 3.5.4.2 节、第 13.4.5 节、第 17.4.1 节和第 20.6 节至第 20.10 节.这是一个非常好的参考。
E
Emre Pişirici

您还可以对缓存文件使用查询字符串。它不会影响您的样式和 js 文件的行为。

例如:

example.com/mystyle.css -> 
example.com/mystyle.css?<?php echo random(1000, 5000); ?>

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅