PHP 页面似乎对某些用户进行了缓存,但对其他用户却没有?
PHP Page appears to be caching for some users but not for others?
我遇到了一个奇怪的情况,我希望有人可能以前经历过这种情况并且知道可能导致这种情况发生的情况。
我有一个 PHP 网站,它从 SQL 数据库访问数据。用户填写表单以添加或编辑已发布的数据,并将数据写入数据库。如果用户正在编辑现有数据,php 加载表单所需的数据,我使用 JavaScript 在页面加载后将数据填充到适当的字段中。
所有这些在我测试过的所有机器和大多数用户上对我来说都能正常工作。
然而...有些用户报告说他们在表单中看到的数据不正确,而是过时的信息。因此,当这些用户“编辑”表单时,他们看到的不是当前包含在数据库中的信息,而是旧信息。
我的理解是(通常)php 文件不会被缓存,因为它们在服务器上执行,然后将最终产品交给用户。是否有任何情况可能导致某些用户在从服务器接收到这些“组装”文件后以某种方式缓存这些文件,然后在下次加载页面时重新加载?
示例:
今天一位客户试图使用表格编辑信息。他们打电话给我是因为某个字段显示的内容不正确。
我登录到我的站点并加载了相同的表单。我的表格显示了正确的数据(包含在 SQL 数据库中),而他们的显示了不同的数据。
两个不同的用户正在查看相同的 php 网页和相同的表单,使用相同的浏览器 (chrome),应该显示相同的数据,但实际上不是。
我对如何追踪并解决这个问题感到困惑。
更新:
玩了一会儿后,我怀疑这可能是客户端浏览器或互联网比大多数浏览器慢一点的问题,这可能导致 Javascript 在页面完全加载之前执行.
我将其更改为使用 jQuery 执行 javascript onload,这可能会解决问题,直到我可以重新编写更优雅的解决方案,但尚未收到此特定客户的回复,所以不要不知道这是否为他们解决了这个问题......但它肯定不会受到伤害。
也许浏览器正在缓存页面?
为确保浏览器无缓存,请在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 在服务器上执行,因此它们不会被缓存。然而,浏览器基本上缓存频繁或最近的表单数据以备后用。让我们详细讨论一下。
默认情况下,浏览器会观察并记住网站上通过 <input>
字段填写的所有信息。这使浏览器能够提供自动完成(即,建议用户已开始输入的字段的可能完成)或自动填充。
默认情况下启用这些功能,但用户可以根据需要禁用此功能。但是,浏览器不会缓存一些敏感信息,例如 pin 码等。要禁用此浏览器默认缓存行为,您可以将 autocomplete
属性设置为 "off"
:
autocomplete="off"
您可以对整个表单或表单中的特定输入元素执行此操作:
<form method="post" action="/form" autocomplete="off">
[…]
</form>
在表单上设置自动完成有两个效果。
- 它通知浏览器不要保存用户在表单字段中输入的数据以供以后自动完成
- 它阻止浏览器在会话历史记录中缓存表单数据。当数据被缓存一次时,稍后当用户使用相同的表单和相关输入字段时会使用它。简而言之,缓存的数据映射到相关的输入字段。
但是,需要注意的重要一点是自动完成行为不适用于登录表单。即表格包括用户名和密码字段。此外,浏览器允许用户选择一个主密码,浏览器将使用该主密码来加密存储的登录详细信息。出于这个原因,许多现代浏览器不支持登录字段的 autocomplete="off":
- 如果站点为 a 设置了 autocomplete="off",并且表单包含用户名和密码输入字段,那么浏览器仍会提示记住此登录,如果用户同意,浏览器将自动填充这些字段下次用户访问该页面时。
- 如果站点为用户名和密码字段设置了 autocomplete="off",则浏览器仍会提示记住此登录,如果用户同意,浏览器将在用户下次访问该页面时自动填充这些字段.
然而,最后但同样重要的是,有真正的解决方案可以消除这个问题,这就是填写用户编辑表单服务器端。即通过 PHP。在这种情况下,无需担心缓存问题,一切都会顺利进行。即
<input type="text" value="<?php echo $username; ?>" name="firstname"/>
希望本次讨论对您有所帮助!
我遇到了一个奇怪的情况,我希望有人可能以前经历过这种情况并且知道可能导致这种情况发生的情况。
我有一个 PHP 网站,它从 SQL 数据库访问数据。用户填写表单以添加或编辑已发布的数据,并将数据写入数据库。如果用户正在编辑现有数据,php 加载表单所需的数据,我使用 JavaScript 在页面加载后将数据填充到适当的字段中。
所有这些在我测试过的所有机器和大多数用户上对我来说都能正常工作。
然而...有些用户报告说他们在表单中看到的数据不正确,而是过时的信息。因此,当这些用户“编辑”表单时,他们看到的不是当前包含在数据库中的信息,而是旧信息。
我的理解是(通常)php 文件不会被缓存,因为它们在服务器上执行,然后将最终产品交给用户。是否有任何情况可能导致某些用户在从服务器接收到这些“组装”文件后以某种方式缓存这些文件,然后在下次加载页面时重新加载?
示例:
今天一位客户试图使用表格编辑信息。他们打电话给我是因为某个字段显示的内容不正确。
我登录到我的站点并加载了相同的表单。我的表格显示了正确的数据(包含在 SQL 数据库中),而他们的显示了不同的数据。
两个不同的用户正在查看相同的 php 网页和相同的表单,使用相同的浏览器 (chrome),应该显示相同的数据,但实际上不是。
我对如何追踪并解决这个问题感到困惑。
更新:
玩了一会儿后,我怀疑这可能是客户端浏览器或互联网比大多数浏览器慢一点的问题,这可能导致 Javascript 在页面完全加载之前执行.
我将其更改为使用 jQuery 执行 javascript onload,这可能会解决问题,直到我可以重新编写更优雅的解决方案,但尚未收到此特定客户的回复,所以不要不知道这是否为他们解决了这个问题......但它肯定不会受到伤害。
也许浏览器正在缓存页面?
为确保浏览器无缓存,请在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 在服务器上执行,因此它们不会被缓存。然而,浏览器基本上缓存频繁或最近的表单数据以备后用。让我们详细讨论一下。
默认情况下,浏览器会观察并记住网站上通过 <input>
字段填写的所有信息。这使浏览器能够提供自动完成(即,建议用户已开始输入的字段的可能完成)或自动填充。
默认情况下启用这些功能,但用户可以根据需要禁用此功能。但是,浏览器不会缓存一些敏感信息,例如 pin 码等。要禁用此浏览器默认缓存行为,您可以将 autocomplete
属性设置为 "off"
:
autocomplete="off"
您可以对整个表单或表单中的特定输入元素执行此操作:
<form method="post" action="/form" autocomplete="off">
[…]
</form>
在表单上设置自动完成有两个效果。
- 它通知浏览器不要保存用户在表单字段中输入的数据以供以后自动完成
- 它阻止浏览器在会话历史记录中缓存表单数据。当数据被缓存一次时,稍后当用户使用相同的表单和相关输入字段时会使用它。简而言之,缓存的数据映射到相关的输入字段。
但是,需要注意的重要一点是自动完成行为不适用于登录表单。即表格包括用户名和密码字段。此外,浏览器允许用户选择一个主密码,浏览器将使用该主密码来加密存储的登录详细信息。出于这个原因,许多现代浏览器不支持登录字段的 autocomplete="off":
- 如果站点为 a 设置了 autocomplete="off",并且表单包含用户名和密码输入字段,那么浏览器仍会提示记住此登录,如果用户同意,浏览器将自动填充这些字段下次用户访问该页面时。
- 如果站点为用户名和密码字段设置了 autocomplete="off",则浏览器仍会提示记住此登录,如果用户同意,浏览器将在用户下次访问该页面时自动填充这些字段.
然而,最后但同样重要的是,有真正的解决方案可以消除这个问题,这就是填写用户编辑表单服务器端。即通过 PHP。在这种情况下,无需担心缓存问题,一切都会顺利进行。即
<input type="text" value="<?php echo $username; ?>" name="firstname"/>
希望本次讨论对您有所帮助!