widmogrod / zf2-semi-http-cache
ZF2 HTTP 缓存
Requires
- php: >=5.3
Requires (Dev)
- phpunit/phpunit: 3.7.*
- zendframework/zendframework: 2.1.*
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)
简单工作流程
-
浏览器请求资源
/data.json
。在应用程序中,为该资源设置了 60 秒的最大存活时间。应用程序返回包含以下头部的响应Last-Modified: 2013-04-01 10:00:00 GMT
Cache-Control: max-age=60
-
a) 浏览器尝试在 10 秒后请求资源
/data.json
,但它已经缓存了内容,因此它从浏览器缓存中返回数据。没有发起请求。 -
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
- 注意这是旧的最后修改时间。
-
在 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
安装
cd my/project/directory
- 创建一个包含以下内容的
composer.json
文件
{ "require": { "widmogrod/zf2-semi-http-cache": "dev-master" } }
- 运行
php composer.phar install
- 打开
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 ), ), );
待办事项
- 创建一个简单的 UML 图描述工作流程
- 带有 Varnish 缓存的示例。
节省时间的技巧和窍门
您的应用程序使用会话吗?
- 请记住在登录等动作中启动会话,而不是每次都这样做。
- 如果已启动会话,则可以发送像 Set-Cookie 和 Cache-Control 这样的头部。为了避免在 Varnish 中缓存像 Set-Cookie 这样的头部,最好的决定是将
session_cache_limiter('no-cache'); session_cache_expire(0);