【问题标题】:PHP Page appears to be caching for some users but not for others?PHP 页面似乎为某些用户缓存,但不为其他用户缓存?
【发布时间】:2021-12-03 08:41:38
【问题描述】:

我遇到了一个奇怪的情况,我希望有人可能曾经经历过这种情况并知道可能的情况会导致这种情况发生。

我有一个从 SQL 数据库访问数据的 PHP 网站。用户填写表格以添加或编辑已发布的数据并将数据写入数据库。如果用户正在编辑现有数据,则 php 会加载表单所需的数据,一旦页面加载完毕,我会使用 JavaScript 将数据填充到适当的字段中。

所有这些都适用于我测试过的所有机器和大多数用户。

但是...一些用户报告说他们在表单中没有看到正确的数据,而是看到了过时的信息。因此,当这些用户“编辑”表单时,他们看到的不是数据库中当前包含的信息,而是旧信息。

我的理解是(通常)php 文件不会被缓存,因为它们是在服务器上执行的,然后将最终产品交给用户。是否有任何情况可能导致某个用户在从服务器接收到这些“组装”文件后以某种方式缓存这些文件,然后在下次页面加载时重新加载?

例子:

今天,一位客户试图使用表单编辑信息。他们打电话给我是因为某个字段显示不正确。

我登录了我的网站并加载了相同的表单。我的表单显示了正确的数据(包含在 SQL 数据库中),而他们的表单显示了不同的数据。

两个不同的用户使用相同的浏览器(chrome)查看相同的 php 网页和相同的表单,应该显示相同的数据,但事实并非如此。

我不知道如何追踪这个问题并解决它。

更新:

玩了一会儿后,我怀疑这可能是客户端的浏览器或互联网比大多数慢一点的问题,这可能导致 Javascript 在页面完全加载之前执行。

我将其更改为使用 jQuery 执行 javascript onload,这可能会解决问题,直到我可以重新编写更优雅的解决方案,但尚未收到此特定客户端的回复,所以不知道这是否为他们解决了问题然而……但它肯定不会受到伤害。

【问题讨论】:

    标签: javascript php sql caching


    【解决方案1】:

    也许浏览器正在缓存页面?
    为确保浏览器没有缓存,请在 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");
    ?>
    

    【讨论】:

    • 去试试你建议的代码,看看它是否有帮助。肯定不会痛!我只是想知道为什么(或如何)它会尝试缓存一个 .php 文件,因为它是由服务器动态创建的。一旦我让客户测试它就会报告!谢谢。
    【解决方案2】:

    就像您提到的那样,PHP 在服务器上执行,因此它们不会被缓存。但是,浏览器基本上会缓存频繁或最近的表单数据以供以后使用。让我们详细讨论一下。

    默认情况下,浏览器会观察并记住通过网站上的&lt;input&gt; 字段填写的所有信息。这使浏览器能够提供自动完成(即为用户已开始输入的字段建议可能的完成)或自动填充。

    这些功能默认启用,但用户可以按需禁用此功能。但是,浏览器不会缓存一些敏感信息,如密码等。要禁用此浏览器默认缓存行为,您可以将 autocomplete 属性设置为 "off"

    autocomplete="off"
    

    您可以对整个表单执行此操作,也可以对表单中的特定输入元素执行此操作:

    <form method="post" action="/form" autocomplete="off">
     […]
    </form>
    

    在表单上设置自动完成有两个效果。

    1. 它通知浏览器不要将用户输入的数据保存在表单字段中以供以后自动完成
    2. 它可以防止浏览器在会话历史记录中缓存表单数据。当数据被缓存一次时,它会在用户使用相同的表单和相关的输入字段时使用。简而言之,就是将缓存的数据映射到相关的输入字段。

    但是,需要注意的重要一点是,自动完成行为不适用于登录表单。即表格包括用户名和密码字段。此外,浏览器允许用户选择一个主密码,浏览器将使用该主密码来加密存储的登录详细信息。因此,许多现代浏览器不支持登录字段的 autocomplete="off":

    1. 如果站点为 a 设置了 autocomplete="off",并且表单包含用户名和密码输入字段,则浏览器仍会提供记住此登录信息,如果用户同意,浏览器将在下次自动填充这些字段用户访问该页面。
    2. 如果站点将用户名和密码字段设置为 autocomplete="off",则浏览器仍会提供记住此登录信息,如果用户同意,浏览器将在用户下次访问该页面时自动填充这些字段。

    但是,最后但并非最不重要的一点是,有一个真正的解决方案可以消除此问题,即填写用户编辑表单服务器端。即通过PHP。在这种情况下,就不用担心缓存问题,一切都会顺利进行。即

    <input type="text" value="<?php echo $username; ?>" name="firstname"/>
    

    希望本次讨论对你有所帮助!

    【讨论】:

    • 很多很棒的信息!我很欣赏细节。在我的一些表单中,我使用了您上面提到的关于在服务器级别填写它的确切方法。这是我后来发现的一种选择。在这个特定的表单中,我使用 javascript 和 DOM 在加载后填充字段。我怀疑这将是解决问题的更优雅的解决方案,并且一直在考虑进行此更改,因为它也更清洁。
    • @GregSteiner 谢谢你的客气话。如果它对其他用户也有用,请将其标记为已接受。这对我来说将是一个很大的乐趣。
    • 我只是在等待客户确认这解决了他们的问题,然后才正式“确认”它是解决方案,尽管我已经投了赞成票!
    猜你喜欢
    • 2021-04-26
    • 2019-07-21
    • 2011-01-06
    • 2012-10-01
    • 2011-09-03
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多