【发布时间】:2012-01-14 03:54:57
【问题描述】:
如果您有一个实时网站(使用 PHP、MySQL、JS、CSS)并说您更改了某些功能。确保当用户访问该站点时,更改的页面得到更新而不是从缓存中加载的最佳方法是什么?
【问题讨论】:
标签: php javascript mysql html css
如果您有一个实时网站(使用 PHP、MySQL、JS、CSS)并说您更改了某些功能。确保当用户访问该站点时,更改的页面得到更新而不是从缓存中加载的最佳方法是什么?
【问题讨论】:
标签: php javascript mysql html css
为此,有文件加载器。当你加载 css、js 或任何其他文件时,你必须设置缓存控制头。您可以通过编辑 .htaccess 或使用 php 来完成。
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A300
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A3600
ExpiresByType text/css A3600
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A300
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A300
</IfModule>
PHP演示:
$offset = 3600 * 24;
$expire = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header($expire);
【讨论】:
通过 HTML,在 Head 部分放置...
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
【讨论】:
如果每个浏览器都符合标准,您无法真正控制每个浏览器的策略,但通常会发生的是浏览器在决定是否应该从缓存加载或重新下载之前从每个 HTML 下载标题.
查看RFC HTTP 1.1 Header Field 了解更多详情(特别是在缓存控制下)
【讨论】:
除非您有某种形式的缓存,否则用户将请求数据并检查它是否已更新。通常你的 PHP 不会被缓存,除非你有主动缓存。
您的 JS 和 CSS 必须通过 Apache(或您使用的任何 Web 服务器)下的 HEADERS 设置。
【讨论】:
你可以使用 window.applicationCache.swapCache();和 window.location.reload();在 javascript 确认网站有更新版本后强制重新加载页面。
更好的选择可能是以某种方式提示用户,让他们知道网站已更新。这样,页面不会突然重新加载。
function updateCache(){
window.applicationCache.swapCache();
window.location.reload();
}
window.applicationCache.addEventListener("updateready", updateCache, false);
【讨论】: