【发布时间】:2012-08-16 11:46:22
【问题描述】:
我应该将给定资源的 ETag 存储在哪里?
方法 A:动态计算
根据每个请求即时获取资源并计算 ETag:
$resource = $repository->findByPK($id); // query
// Compute ETag
$etag = md5($resource->getUpdatedAt());
$response = new Response();
$response->setETag($etag);
$response->setLastModified($resource->getUpdatedAt());
if($response->isNotModified($this->getRequest())) {
return $response; // 304
}
方法 B:在数据库级别存储
在使 INSERT 和 UPDATE 语句变慢的同时节省一点 CPU 时间(我们使用触发器来更新 ETag):
$resource = $repository->findByPK($id); // query
$response = new Response();
$response->setETag($resource->getETag());
$response->setLastModified($resource->getUpdatedAt());
if ($response->isNotModified($this->getRequest())) {
return $response;
}
方法 C:缓存 ETag
这类似于方法 B,但 ETag 存储在一些缓存中间件中。
【问题讨论】:
-
我不太明白,你说的是服务器端吧?为什么不在资源上有 PUT/POST/DELETE 并缓存它时计算它?您将始终拥有最新的 ETag。还是外部进程正在修改您的文件?
-
@Hugo 很抱歉让您感到困惑。不处理文件,而是处理资源/实体。我的问题是关于在哪里存储 etag:使用数据库 + 触发器或任何其他机制。
标签: http caching httpresponse http-caching etag