fideloper / resourcecache
使用 If-* 标头处理 HTTP 验证缓存
Requires
- php: >=5.3.0
- illuminate/database: 4.0.x
- illuminate/support: 4.0.x
- symfony/http-foundation: 2.3.*
Requires (Dev)
- mockery/mockery: 0.7.2
- phpunit/phpunit: 3.7.*
This package is auto-updated.
Last update: 2024-09-06 08:47:36 UTC
README
注意 1: 此库在功能上与 Symfony 内置的 验证缓存 代码相似。具体来说,Symfony 处理条件 GET。此库也处理并发控制。条件 GET 和并发控制范例都使用 ETags 或最后修改日期。
注意 2: 我已重新编写了这个库,采用了我喜欢的方式。请参阅我的 ConditionalRequest 库/软件包。这个新的包仍然封装了 Symfony HttpCache 软件包中的一些业务逻辑,但在其基础上进行了一些扩展。具体来说,两者都支持条件 GET。ConditionalRequest 还包括使用相同范例的并发控制。
情况
框架很少提供工具来控制 HTTP 缓存,例如设置 ETags 或最后修改日期。
目标
此软件包旨在为您提供缓存控制。其目标是
- 允许验证缓存(使用 ETags 与 If-Match、If-None-Match、Last-Modified 与 If-Modified、If-Unmodified 等)
- 允许过期缓存(使用 Expires、Last-Modified、Cache-Control 和可能还有 Pragma 标头)
- 帮助开发者了解 HTTP 和缓存,这是一个经常被忽视的主题
安装
这是一个 Composer 软件包,可在 Packagist 上找到。
要安装它,编辑您的 composer.json 文件并添加
{ "require": { "fideloper/resourcecache": "dev-master" } }
如果您正在将此安装到 Laravel 4
,那么您需要添加服务提供者。为此,打开 app/config/app.php
,并将此条目添加到其他服务提供者中。
# File: app/config.app.php 'providers' => array( ...other providers... 'Fideloper\ResourceCache\ResourceCacheServiceProvider', ),
用法
有两个步骤
- 实现 Resource 接口(如果您使用 Laravel 4,则为您完成此操作)
- 使用 ResourceRequest 和 ResourceResponse 类与您的 Resource 一起使用
实现 Resource 接口
此软件包包含一个请求接口和响应接口。应针对您的特定需求实现这些接口。例如,对于使用 Symfony Request/Response 类的 Laravel 4,我已为每个创建了 Symfony 实现。
您必须实现
Fideloper\ResourceCache\Http\ResourceInterface
Fideloper\ResourceCache\Http\ResponseInterface
Fideloper\ResourceCache\Resource\ResourceInterface
示例实现可以在 维基百科中找到。
使用您的请求/响应和资源类
一旦您组成一个实现,您就可以在控制器中使用它们。您可以在 这里 找到示例。
一些解释
有几种缓存类型
- 应用程序内缓存(Memcache、Redis、其他内存存储)
- HTTP 缓存 - 网关、代理和私有(即浏览器和类似)
使响应(网页、API 响应等)可通过第三方缓存是 HTTP 缓存机制的一部分。您使用的缓存机制取决于您的用例。
HTTP 规范定义了两种 HTTP 缓存方法
- 验证 - 通过不使源服务器回复完整消息体(仅响应头)来节省带宽
- 过期 - 为了节省往返源服务器的次数 - 缓存可以潜在地直接提供响应,从而节省源服务器甚至不知道请求
使用 if-* 标头进行的验证缓存(if-match、if-modified-since 等)对于两件事很有用(在我看来最有用的是 API)。
- 条件GET请求 - 服务器可以告知请求“自从您上次检查以来,没有发生变化”。这对于移动API来说很好,因为通过条件请求可以节省重新发送消息体的带宽。
- 并发控制 - 在POST请求中,更可能是PUT请求中,服务器可以检查正在更新的资源是否在请求者上次检查后发生了变化(解决了丢失更新问题)。这对于资源有大量写入(更新)的API来说很好。
使用Expires、Cache-Control、Last-Modified和其他头部完成的过期缓存可以帮助为下一个用户(甚至是特定用户)缓存响应,从而减少您的服务器(们)的流量负载。
- 如果您有像Varnish这样的网关缓存,您可以潜在地为每个用户缓存对端点的响应。网关缓存为您提供了大量的缓存控制,因为它是您堆栈的一部分。
- 在缓存控制和身份验证方面都将您的响应设置为“公共”将允许代理缓存缓存您站点的页面内容。
- 在身份验证和/或SSL后面的请求通常不会被缓存。您可能可以通过网关缓存或私有缓存(即,您的客户端可以根据您的过期头部来推断缓存)来实现这一点。