【问题标题】:PHP How to not cache generated HTML but cache static data like images/js/cssPHP如何不缓存生成的HTML,而是缓存图像/js/css等静态数据
【发布时间】:2015-09-01 01:54:41
【问题描述】:

许多 PHP 开发人员在他们的 PHP 页面顶部添加了 no-cache 标头,我也这样做了,原因很明显。由于 PHP 生成的内容通常是动态的,让浏览器缓存它们会导致向用户呈现过时的数据。为了避免这种缓存通常被禁用。

<?php
    //no  cache headers 
    header("Expires: Mon, 26 Jul 1990 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
?>

问题在于,由于此标头,我的图像、javascript 文件和 css 文件也是静态的,因此可以(并且应该)被缓存,也没有被缓存。这会大大降低网站速度。

有没有办法不缓存 PHP 内容,但仍然缓存 js/images/css?

假设我拥有修改 (linux) 服务器配置、HTACCESS 以及 PHP 文件本身的完全访问权限,如何实现这一点?

或者动态 PHP 文件不需要整个“无缓存”?即使它们被 url 重写以显示无扩展名。

【问题讨论】:

标签: javascript php css image caching


【解决方案1】:

您可以使用 htaccess 来定义要缓存的文件 您只需要在您网站的主目录中创建一个 .htaccess 文件并添加此代码

示例:

# cache images/pdf docs for 1 week
<FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif)$">
  Header set Cache-Control "max-age=604800, public, must-revalidate"
  Header unset Last-Modified
</FilesMatch>

# cache html/htm/xml/txt diles for 2 days
<FilesMatch "\.(css|js)$">
  Header set Cache-Control "max-age=172800, must-revalidate"
</FilesMatch>

【讨论】:

  • 我想他知道他只是想用 php 来做。
  • 是的,我已经这样做了,但感觉很hacky。我只是想知道是否存在更清洁的方法。
【解决方案2】:

我可能是错的,但我相信您可以将所有 js 和 CSS 文件放入一个 php 中,然后使用类似

的东西缓存它
ob_start ("ob_gzhandler");
ob_start("compress");

所以你会有一个 .php 来定义它的标题,然后你的 js 和 css 文件以及上面的一些要求。

您可能需要几个 if 语句来获取更改等。

我会在我目前在手机上的几个中做出更全面的回答。


更新

在 git 上找到了一个资源,我认为它可以帮助你走上正确的道路。

https://github.com/SubZane/CSS-Compressor/blob/master/csscompressor.php

【讨论】:

  • 谢谢,合并这些静态文件会大大加快速度,这也是我一直在研究的。这可能会立即解决所有这些问题。我一定会调查的。
  • 很高兴你的排序伴侣。
  • 您的解决方案适用于 js 和 css 文件,但对于图像,我想我仍然必须使用 mohamed amin 的解决方案。
  • 让我考虑一下图像并回复您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2017-01-04
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多