Phalcon,生成图像的 HTTP 缓存
Phalcon, HTTP Cache of a generated image
我正在编写一个使用 Phalcon 生成图像缩略图的 Web 服务。
我尝试对它进行 HTTP 缓存。
这是我的代码:
$seconds = 43200;
$expireDate = new DateTime();
$expireDate->modify("+ $seconds seconds");
$finfo = new finfo(FILEINFO_MIME_TYPE);
$app->response->setHeader('Content-Type', 'Content-type: ' . $finfo->buffer($data));
$app->response->setExpires($expireDate);
$app->response->setHeader('Pragma', 'cache');
$app->response->setHeader('Cache-Control', "private, max-age=$seconds");
$app->response->setHeader('E-Tag', md5(filemtime($path)));
$app->response->setHeader('Last-Modified', gmdate('D, d M Y H:i:s', filemtime($path)).' GMT');
$app->response->sendHeaders();
echo $data;
图片显示正确。但是当你刷新它时,http 代码总是 200,我尝试另一个网站的另一个图像,我得到了 200, 304, 304, 304...
这是我的原始回复 header :
HTTP/1.1 200 OK
Date: Thu, 27 Aug 2015 18:38:41 GMT
Server: Apache/2.4.10 (Debian)
Expires: Fri, 28 Aug 2015 06:38:41 GMT
Pragma: cache
Cache-Control: private, max-age=43200
E-Tag: 501a8d62f276eb5b165b8a709bf4e5b4
Last-Modified: Sun, 05 Jul 2015 20:34:14 GMT
Keep-Alive: timeout=5, max=90
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: image/jpeg
有人看到我做错了什么了吗?
提前致谢。
如果您将 max-age 添加到 last-modified 日期,您将获得过去的到期时间。
您的代码是影响缓存的各种可能方式的混乱(顺便说一句,http 没有定义 "pragma: cache" header)。至于您 应该 做什么的问题,这取决于您要实现的目标 - 只是减轻服务器负载、更快的页面呈现或缓存 apre-planned更换或其他东西。你还没有告诉我们这是什么。
当浏览器询问缓存图像是否仍然有效时,您的 php 代码需要 return 304 未修改 header。在再次发送图像之前,在脚本顶部放置一个 if 语句来处理该请求。
您总是在发送图像,这就是浏览器显示 200 响应的原因。
谢谢保罗!
$filemtimeOk = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $filemtime <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
$etagOk = isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag;
if ($filemtimeOk && $etagOk) {
$app->response->setStatusCode(304, "Not Modified");
$app->response->sendHeaders();
} else {
// Normal case... (send data and headers)
}
我正在编写一个使用 Phalcon 生成图像缩略图的 Web 服务。
我尝试对它进行 HTTP 缓存。
这是我的代码:
$seconds = 43200;
$expireDate = new DateTime();
$expireDate->modify("+ $seconds seconds");
$finfo = new finfo(FILEINFO_MIME_TYPE);
$app->response->setHeader('Content-Type', 'Content-type: ' . $finfo->buffer($data));
$app->response->setExpires($expireDate);
$app->response->setHeader('Pragma', 'cache');
$app->response->setHeader('Cache-Control', "private, max-age=$seconds");
$app->response->setHeader('E-Tag', md5(filemtime($path)));
$app->response->setHeader('Last-Modified', gmdate('D, d M Y H:i:s', filemtime($path)).' GMT');
$app->response->sendHeaders();
echo $data;
图片显示正确。但是当你刷新它时,http 代码总是 200,我尝试另一个网站的另一个图像,我得到了 200, 304, 304, 304...
这是我的原始回复 header :
HTTP/1.1 200 OK
Date: Thu, 27 Aug 2015 18:38:41 GMT
Server: Apache/2.4.10 (Debian)
Expires: Fri, 28 Aug 2015 06:38:41 GMT
Pragma: cache
Cache-Control: private, max-age=43200
E-Tag: 501a8d62f276eb5b165b8a709bf4e5b4
Last-Modified: Sun, 05 Jul 2015 20:34:14 GMT
Keep-Alive: timeout=5, max=90
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: image/jpeg
有人看到我做错了什么了吗?
提前致谢。
如果您将 max-age 添加到 last-modified 日期,您将获得过去的到期时间。
您的代码是影响缓存的各种可能方式的混乱(顺便说一句,http 没有定义 "pragma: cache" header)。至于您 应该 做什么的问题,这取决于您要实现的目标 - 只是减轻服务器负载、更快的页面呈现或缓存 apre-planned更换或其他东西。你还没有告诉我们这是什么。
当浏览器询问缓存图像是否仍然有效时,您的 php 代码需要 return 304 未修改 header。在再次发送图像之前,在脚本顶部放置一个 if 语句来处理该请求。
您总是在发送图像,这就是浏览器显示 200 响应的原因。
谢谢保罗!
$filemtimeOk = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $filemtime <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
$etagOk = isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag;
if ($filemtimeOk && $etagOk) {
$app->response->setStatusCode(304, "Not Modified");
$app->response->sendHeaders();
} else {
// Normal case... (send data and headers)
}