【问题标题】:Apache or PHP keeps the HTML output in some kind of cache for a couple of minutes?Apache 或 PHP 将 HTML 输出保存在某种缓存中几分钟?
【发布时间】:2017-07-19 19:47:19
【问题描述】:

我最近在我的 Windows 10 机器上放弃了 XAMPP,并手动重新安装了 Apache (2.4)、PHP 7 和 MySQL(我按照说明 given here 以便能够在 PHP 版本之间轻松切换)。

一切正常,除了现在我在 PHP 文件中进行更改并在浏览器中点击刷新时,更改通常不会立即出现在浏览器中。无论我多么用力地按 F5(或 Ctrl+F5),我仍然会得到未修改的源代码,而且我必须等待几分钟才能最终在浏览器中看到这些更改。

不用说,开发的时候挺烦的。当我使用 XAMPP 时,它并没有发生。

所以似乎某处有某种缓存,但我找不到它在哪里。我不知道是 Apache 还是 PHP,虽然我怀疑它可能是 PHP,因为 CSS 或 JS 文件不受此问题的影响(据我所知)。

知道导致这种行为的原因以及如何禁用它吗?

编辑:我做了更多测试。

我创建了最简单的 PHP 文件。只是:

<?php
echo 'test1';

我可以确认即使在这种简单的情况下也会出现问题(将“test1”更改为“test2”:浏览器仍然显示“test1”一段时间)。

在另一个浏览器中打开相同的页面仍然显示过时的代码(test1 而不是 test2)。

清除浏览器缓存没有帮助。

所以问题似乎没有发生在客户端。

然而,如果我使用 HTML 文件而不是 PHP 文件进行相同的测试,那么问题不会发生。对该文件所做的任何更改都可以立即在浏览器中看到(当然我仍然通过 Apache 访问这个文件,所以 http://localhost/some-path/test.html

所以问题似乎只影响 PHP 文件。

【问题讨论】:

  • 首先要始终检查您的浏览器是否缓存了此类内容。所以清空你的浏览器缓存并重试。您还可以打开浏览器开发控制台并在其中禁用缓存。
  • 有服务器端缓存策略,但这些策略在http服务器或php内部都没有实现。你必须采取特殊的步骤来安装这样的层,你会知道的。
  • 不是浏览器。我尝试了 Ctrl+F5 并清空了它的缓存。在另一个浏览器中打开同一页面也会显示过时的页面。就像我说的,当我使用 XAMPP 时,这种行为并没有发生,所以这似乎是服务器端发生的事情。
  • 那么我建议您开始检查服务器内部实际发生的情况。检查http服务器日志文件:请求真的进来了吗?响应带有哪些标题,您可以在浏览器控制台中轻松查看这些标题?您实际上将那些您更改的脚本保存在哪里,是本地驱动器还是“虚拟”的东西?
  • 检查访问日志:似乎一切正常,浏览器中的每次刷新都会生成一个"GET /my-path/test.php HTTP/1.1" 200 5 形式的新条目。脚本存储在我的硬盘驱动器 (c:\htdocs) 上,没有任何虚拟内容。我应该在响应标头中寻找什么?

标签: php apache caching


【解决方案1】:

问题似乎是由 OPCache 模块引起的,我 had to enable 是为了在另一个 (drupal 8) 项目上工作。

php.ini 中,以下行:

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)

opcache.revalidate_freq=60

将60改为1(并重启Apache)基本解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2016-05-12
    相关资源
    最近更新 更多