widmogrod/zf2-semi-http-cache

dev-master 2013-04-14 16:30 UTC

This package is auto-updated.

Last update: 2024-09-07 18:43:30 UTC


README

感叹号

此模块仍处于开发阶段。

介绍

它解决了哪些问题?

  • 当您的应用程序在 Apache 上运行时,Last-Modified 日期错误。这个日期是从 index.php 的修改日期取出的,这并不准确,可能导致浏览器不会缓存响应。

它带来了哪些好处?

启用浏览器缓存工作流程。

  • 处理 If-Modified-Since
    • 减少带宽。如果浏览器有有效的缓存数据,则只发送 304 标头。
    • 通过省略如果浏览器缓存未过时的事件,来加快响应时间。
  • 提供开箱即用的 Cache-Control 管理。
  • 提供更准确的 Last-Modified 日期解决方案(但不是完美的)。

为什么是 semi HTTP 缓存?

因为像 If-Modified-Since 这样的东西是基于 Cache-Control: max-age 计算的,而不是基于请求实体的实际修改日期。每个操作或应用程序的全局都设置了 max-age。这是一个很大的简化,但作为开箱即用的解决方案非常有效。如果您正在寻找更定制的解决方案,我建议采用 Symfony 框架的方法:[https://symfony.ac.cn/doc/2.0/book/http_cache.html](https://symfony.ac.cn/doc/2.0/book/http_cache.html)

简单工作流程

  1. 浏览器请求资源 /data.json。在应用程序中,为该资源设置了 60 秒的最大存活时间。应用程序返回包含以下头部的响应

    • Last-Modified: 2013-04-01 10:00:00 GMT
    • Cache-Control: max-age=60
  2. a) 浏览器尝试在 10 秒后请求资源 /data.json,但它已经缓存了内容,因此它从浏览器缓存中返回数据。没有发起请求。

  3. b) 有时,浏览器可能在 10 秒后尝试请求资源 /data.json,并且它想要验证缓存资源是否过时。因此,它发送带有头部 If-Modified-Since : 2013-04-01 10:00:00 GMT 的请求。但是应用程序知道该资源的有效寿命是 60 秒,因此应用程序返回没有主体但有头部的响应

    • 304 Not Modified
    • Last-Modified: 2013-04-01 10:00:00 GMT - 注意这是旧的最后修改时间。
  4. 在 70 秒后尝试请求资源,但它已经缓存了内容,因此它发送带有头部 If-Modified-Since : 2013-04-01 10:00:00 GMT 的请求来验证缓存资源是否过时。应用程序知道浏览器缓存已过时,因此它返回带有头部和新的响应主体的响应

    • Last-Modified: 2013-04-01 10:01:10 GMT - 注意新的最后修改时间。
    • Cache-Control: max-age=60

安装

  1. cd my/project/directory
  2. 创建一个包含以下内容的 composer.json 文件
{
    "require": {
        "widmogrod/zf2-semi-http-cache": "dev-master"
    }
}
  1. 运行 php composer.phar install
  2. 打开 my/project/folder/configs/application.config.php 并将 'WidHttpCache' 添加到您的 'modules' 参数。

配置

默认情况下,如果未启用,则禁用 HTTP 缓存。如果您想启用它,您应该复制配置文件

cp vendor/widmogrod/zf2-semi-http-cache/config/zf2-semi-http-cache.local.php config/autoload/

或者,将以下配置条目添加到您的本地.php 配置文件中

<?php
return array(
    'zf2-semi-http-cache' => array(
        'enabled' => true,
        'default' => array(
             'max-age'  => 600,   // 10min in browser
        ),
    ),
);

待办事项

  1. 创建一个简单的 UML 图描述工作流程
  2. 带有 Varnish 缓存的示例。

节省时间的技巧和窍门

您的应用程序使用会话吗?

  1. 请记住在登录等动作中启动会话,而不是每次都这样做。
  2. 如果已启动会话,则可以发送像 Set-Cookie 和 Cache-Control 这样的头部。为了避免在 Varnish 中缓存像 Set-Cookie 这样的头部,最好的决定是将
session_cache_limiter('no-cache');
session_cache_expire(0);