我在使用PHP提供CSS文件方面遇到了问题。对于测试,我只是将现有CSS文件中的内容加载到PHP变量中,而不是回显它。我想设置标题以允许缓存文件,直到它被修改。
PHP代码
$css_file_path = "path-to-existing-css-file";
$file_content = file_get_contents ($css_file_path);
$fmtime = date ("r", filemtime ($css_file_path));
header ("Content-type: text/css");
header ("X-Content-Type-Options: nosniff");
header ("Last-Modified: " . $fmtime);
die ($file_contents);
这是通过简单的PHP代码完成的,如上所示。出于某种原因,它从未被缓存(仅在最新的Firefox中测试过)。
我试图将此行放在die()函数之前进行测试。
echo date ("r", time());
它会一直更新。我承认,我是一个这样的缓存菜鸟,所以我想做的就是让文件被缓存,直到新的修改到来。
到目前为止,我已经在这里和网络上阅读了不同帖子的音调,并且大部分都没有找到关于此主题的信息。
我缺少什么,是否有可能实现?
答案 0 :(得分:1)
从
开始我想做的是让文件被缓存,直到新的修改到达
浏览器可以知道有新修改的唯一方法是询问服务器其缓存版本是否仍然有效。
这样做如下:
15s:7d,1m:21d,15m:5y
所以在代码中,第2步,添加Cache-Control-header:
1. Browser requests /style.css
GET /style.css
2. Server sends to browser
HTTP/1.1 200 OK
Last-Modified: Wed 2 Aug 2017 21:28:00 GMT
Cache-Control: must-revalidate, max-age=31536000
... file-contents ...
// 31536000 is about 1 year
3. Next time browser wants that file it sends
GET /style.css
If-Modified-Since: Wed 2 Aug 2017 21:28:00 GMT
4a. Your server can read that header, and verify if the file isn't modified after
the given date. If it isn't, you can reply with a single:
HTTP/1.1 304 Not Modified
... without sending the contents again
4b. If your file was hower modified after Aug 2, you should sent a response simalar
as in step 2
步骤4a,执行If-Modified-Since请求标头:
header('Cache-Control: must-revalidate, max-age=31536000');
替代解决方案,不使用$css_file_path = "path-to-existing-css-file";
$fmtimestamp = filemtime ($css_file_path);
// Check header set by browser
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $fmtimestamp <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
die(); // We're done here
}
// Otherwise continue as ussualy
$file_content = file_get_contents ($css_file_path);
,但如果可以使用,则取决于具体情况:
If-Modified-Since
当您的文件发生变化时,链接会发生变化,浏览器会将其视为新文件。在这种情况下,您可以将// Somewhere in your HTML
<link rel="stylesheet" href="/style.css?version=<?php echo filemtime($pathToStyle.css) ?>" />
- 部分从must-revalidate
- 标题中删除,除非max-age到期或缓存已清除,否则浏览器不会重新加载Cache-Control
。< / p>