Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态缩小CSS:利用浏览器缓存_Php_Css_Caching_Browser Cache - Fatal编程技术网

Php 动态缩小CSS:利用浏览器缓存

Php 动态缩小CSS:利用浏览器缓存,php,css,caching,browser-cache,Php,Css,Caching,Browser Cache,我正在编写一个脚本,它将合并并缩小请求的CSS文件,然后将它们回显出来。我已经完成了大部分工作,但是我只专注于一个小但非常重要的部分:利用浏览器缓存 我们网站的大多数访问者都是新来的,很少回来。因此,我们真正担心的是在同一会话中的页面请求之间进行缓存。比如,他们点击我们的主页,然后导航到其他几页然后离开 我遇到的问题是,我在会话中为每个特定文件集的最后一次请求时间存储了一个时间戳。因此,如果我想要main.css和internet.css这个请求,然后是main.css和phone.css下一页

我正在编写一个脚本,它将合并并缩小请求的CSS文件,然后将它们回显出来。我已经完成了大部分工作,但是我只专注于一个小但非常重要的部分:利用浏览器缓存

我们网站的大多数访问者都是新来的,很少回来。因此,我们真正担心的是在同一会话中的页面请求之间进行缓存。比如,他们点击我们的主页,然后导航到其他几页然后离开

我遇到的问题是,我在会话中为每个特定文件集的最后一次请求时间存储了一个时间戳。因此,如果我想要main.css和internet.css这个请求,然后是main.css和phone.css下一页视图,那么最后一个请求的时间戳将被更新,但是如果我再次请求相同的文件集,时间戳将与上次保持不变

希望我说的有道理。问题是,当一个文件从上一个请求到这个请求保持不变时,我返回304 not modified。但是,浏览器并没有像应该的那样缓存css。为什么不呢


您可以在这里查看我的代码:(我通常会把它放在这里,但有点长)

我认为您应该检查请求头,如果在发送304:

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && 
    strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $minifier->lastModified)
{
    header('HTTP/1.0 304 Not Modified');
    exit;
}
同时注意出口。如果您发送了一个304,这意味着客户端已经有了最新版本,因此您应该在那里退出脚本

编辑:

使用expire标头时,浏览器将假定其已具有最新版本。因此,它甚至不会向服务器发出请求,这与使用HTTP_IF_-MODIFIED_-SINCE头不同

因此,您可能还需要添加:

header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60 * 24)));
然后,为了确保文件更改后它将请求新版本,您可以执行以下操作:

<link rel="stylesheet" type="text/css" 
    href="minify.php?v=<?php echo filemtime($theFileToMinify) ?>">

但我有一个问题,那就是live服务器没有安装mod_头和mod_expires。我也没有安装它们的权限,因此没有设置HTTP\u IF\u MODIFIED\u SINCE。我提出了我的解决方案,但不管怎样,当我发送304时,浏览器仍然不会从缓存中加载css。我不认为你需要mod_头,如果你通过PHPWhen设置头,mod_过期,当我转储$u服务器HTTP_,如果_修改了,因为没有。我明白这是因为那些模块没有安装/启用,但我可能错了。我可以直接设置它们,但我所做的基本上是,不修改$\u服务器阵列。如果上次请求该文件时收到上次修改的头,浏览器将发送HTTP\u IF\u MODIFIED\u。手动刷新您的页面也可能会阻止您的浏览器发送HTTP\U(如果您修改了)。啊,好吧,我已经实现了您的解决方案,它似乎正在工作,所以我会给您检查。谢谢你的帮助!