【问题标题】:PHP Caching stops my website from showing the actual files, and instead shows old files. I have tried everything and nothing worksPHP 缓存阻止我的网站显示实际文件,而是显示旧文件。我已经尝试了一切,但没有任何效果
【发布时间】:2019-04-27 07:50:37
【问题描述】:

我在 localhost 上有一个 php 网站,它一直运行良好,但现在它只显示旧的 css 文件和旧的 js 文件。当我编辑文件并刷新页面时,没有任何变化。

尤其是css布局文件不想更新

我使用: XAMPP 和 阿帕奇

我已经阅读了很多关于这个问题的 stackoverflow 文章,但是我尝试添加的内容对我没有任何帮助:

<?php 

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-Type: application/xml; charset=utf-8");

?>

但这给出了一个错误:

此页面包含以下错误:第 44 行第 8 列的错误: 开始和结束标记不匹配:链接第 0 行和头部下面是一个 页面呈现直到第一个错误。

然后它将页面作为文档处理并仅显示纯文本。

我尝试使用 .htaccess 文件,但这些文件什么都没有

我真的不知道如何处理这个问题,我无法在网站上继续,因为它只是不想更新并且卡在旧页面上。

谁能帮我解决这个问题,因为我有点绝望了。

编辑:

所以我修复了错误,但它仍然没有更新

我把 PHP 改成:

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

?>

因为它把我的页面显示为 XML,但这仍然不会更新布局。

如何让我的页面自动重新加载文件,所以不行(CTRL + F5)。

【问题讨论】:

  • 清除浏览器缓存。或者打开另一个浏览器。或者用另一个“个性”打开浏览器
  • 检查 etags 的页眉
  • 您给我们看的错误不是您给我们看的代码造成的。
  • 如果您提到发出错误的原因(可能是浏览器)会很有帮助

标签: php html mysql apache xampp


【解决方案1】:

我做了 3 件事来确保动态数据不会被缓存:

  1. 设置适当的响应头;
  2. 包含 HTML 元标记;
  3. 为可能发生变化的资源 URL 添加时间戳。

1。设置适当的响应头

基本上这些标头在过去设置过期,设置许多指令以避免您的 PHP 输出和最终客户端之间的服务修改或缓存您的源。

Expires: Sat, 26 Jul 1997 05:00:00 GMT
Cache-Control: nocache, must-revalidate, no-store, max-age=0, private, max-stale=0, post-check=0, pre-check=0, no-transform
Pragma: no-cache

2。包含 HTML 元标记

一些代理和网络客户端会解析 HTML(应该避免使用上面的“no-transform”指令)。因此,向 HTML 输出添加指令可进一步降低缓存风险。

此 html 摘录中有两个“过期”规范 - 据我了解,一些 Web 客户端不会解析日期。

<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Sat, 26 Jul 1997 05:00:00 GMT" />

3。为可能发生变化的资源 URL 添加时间戳。

静态资源(或等价物)如图像、css 文件以及 xml 文件、文本文件、字体等,应缓存以提高性能,但您仍希望在更新它们时避免缓存。

通过向 URL 添加时间戳,URL 将依赖于资源时间戳本身,它将阻止中间服务器提供缓存版本。

您可以将时间戳替换为静态“标签”,如“v1”、“v2”等。但是我更喜欢计算时间戳,因为我不再需要考虑更新它。事实上,我几乎所有的资源都会自动加上时间戳。

这是一个 PHP 示例:

// This is a simple example, it must be adapted to your environment.
// * $initialUrl is a URL like "//mystyle.css" without any get parameter.
// * $resourceUrl is the (relative) server path to that resource
//                 which could be "/var/www/mysit/mystyle.css"
// * filemtime gets the timestamp of the resource.
// * baseconvert gets a shorter representation of that timestamp.
// * The timestamp is appended to the URL by simple concatenation here.
// * $url can then be used to generate the HTML (echo ".... $url ...";).
// * This can (should) be wrapped in a function.  Personally I have integrated
//   it in the MVC Framework I use in an output filter and in a utility
//   class method.
$url=$initialUrl.'?ts='.base_convert(filemtime($resourcePath),10, 36);

注意

有些指令可能是多余的,但最好是多余的而不是让特定用户遇到问题。以上是实际现场经验的结果。例如,在远程调试用户环境后添加“no-transform”,其中移动运营商的代理将 javascript 和 css 资源直接插入 HTML。这非常出乎意料,并且在当时造成了不受欢迎的行为。

浏览器功能也会随着时间而变化,当您有一些用户仍在使用旧浏览器时,有些用户将无法理解某些指令。

所以我建议谨慎行事,尽可能多地添加对策。

【讨论】:

  • 你正在做的很多事情都没有影响。设置 HTTP 标头和元标记都存在冗余。使用查询字符串破坏糟糕的缓存是如此的错误。
  • 在添加关于冗余的注释之前,我没有看到您的评论。 “破坏不良缓存”是什么意思?请注意,时间戳基于资源的日期:当资源不更改允许缓存它时,它是“恒定的”。我发现时间戳是当您不再需要它们时真正避免在客户端中使用缓存资源的唯一方法。你有更好的建议吗?为什么它仍然在 ajax 调用中使用(例如由 jQuery 生成)? “D.Joe”的回答者也建议它(“..?ver01”)
【解决方案2】:

仅当您的 html 页面的文档类型为 XHTML 时才会出现此错误。您可以通过查看文档的第一行来检查这一点,它声明了一个 XTHML 文档类型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

这意味着所有 html标签必须正确关闭,例如

<head>
    <title>my webpage</title>
    <link rel="stylesheet" type="text/css" href="mystyles.css"></link>
</head>

注意我在第三行添加的&lt;/link&gt;。解决此问题的最简单方法是将文档类型更改为

<!DOCTYPE html>

这意味着您的文档不必是well-formed

另一种方法是关闭所有 html 标签。

我建议您尝试一下,如果缓存问题仍然存在,请再次询问。


并且不要缓存样式表文件

执行此操作的最简单方法是在更改样式时向样式表文档添加一个新参数(例如带有版本号的 ?ver):

<link rel="stylesheet" type="text/css" href="mystyles.css?ver01"></link>

应该可以,您不必更改样式表的文件名。

另一种更复杂的方法是安装 mod_expires 并在您的 apache2 配置中定义它:

ExpiresActive On
ExpiresDefault “access plus 10 days”
ExpiresByType text/css “access plus 1 second”

我希望这会有所帮助!如果是这样,我将不胜感激接受这个答案。

【讨论】:

  • Html 5 也必须格式正确。无效的 html 或格式不正确的 html 会导致显示错误
  • 啊,好吧,但是我在 html5 规范中找不到,你能指点我吗?浏览器会在格式不正确的 html5 文档上抛出 Opening and ending tag mismatch 吗?
  • 不,不是 html 5.. 但是浏览器遵循这条准则的后半部分,接受网页并尝试显示它们,即使它们不是合法的 HTML。通常这意味着浏览器会尝试对您可能的意思做出有根据的猜测。 , 如果你的 HTML 真的是病态的, 浏览器可能会变得非常混乱并产生混乱, 甚至崩溃 Source validator.w3.org/docs/help.html#validation_basics
  • 好吧,我照你说的做了,现在错误消失了,但页面现在显示为 XML 我在 .php 文件中使用常规 html 和常规 doctype,我应该如何解决这个问题?
  • 好的,所以我修复了错误,它不再显示xml,但是css仍然没有更新,我该如何解决这个问题?
猜你喜欢
  • 2011-03-16
  • 2021-05-04
  • 2017-02-07
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多