开发者社区> 问答> 正文

求教php、apache的cache-control头的控制,报错

"自己做了一个php控制的缓存,依靠etag和文件缓存来处理
如果浏览器发送了etag,则进行对比,etag一致,直接发送304,etag不一致,如果有文件缓存,则直接读取文件缓存,并发送当前服务器缓存的etag
(文件缓存和etag的更新在其他地方处理)

现在突然发现有响应没有返回304,一查,发现这个地址的服务器http响应头返回了cache-control:no-cache
我清空服务器的缓存后看,第一次响应的时候服务器就自动发送了一个no-cache头,(我的etag也发送了出去的),结果就是无论服务器端有没有缓存,浏览器都不会把etag添加到自己的请求头里面去,服务器端处理的时候没有收到etag,就当做是第一次请求,然后又重新读取文件缓存,又重新发送 etag……(响应200)

大致是这么回事,但是这样就失去了我想用304来直接缓存的效果了。

看了一下区别,正常的数据,大概10KB,运行一直正常(没有缓存初次请求130ms,有缓存初次请求90ms,之后16ms或以下)
而没有发送304的这个(服务器一直发送no-cache),数据只有304B,(但是就算不加缓存模块,因为服务器计算的原因,也要花90ms左右),
怀疑是不是因为数据返回不一致的原因而导致的,将这个304B的数据扩增到12KB,还是发送no-cache头,增加到20kb,也是一样的。

然后懵了……不知道怎么回事了。

(天地良心,代码全部是我写的,除了一个header(etag)外绝对没有发送其他的header了)

展开
收起
一枚小鲜肉帅哥 2020-06-20 20:27:32 1226 0
1 条回答
写回答
取消 提交回答
  • 菜不可及的程序猿

    304是门哲学.. <pre class=""brush:php; toolbar: true; auto-links: false;"">//缓存时间. 12H $cache_time=43200; if($_GET['admcode'] && $_SERVER['HTTP_IF_MODIFIED_SINCE']){ $ctime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])+$cache_time; if ($ctime > time()){ header('HTTP/1.1 304 Not Modified'); exit(); } }

    ######其他页面都没有问题,只有一个页面有问题,而这个页面的代码结构和其他地方都没有任何的区别,发誓header绝对只用了发送etag 而且是同一个浏览器得到的结果。http://www.oschina.net/code/snippet_1172599_51628######原因已找到
    2020-06-20 20:28:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载

相关镜像