Phalcon,生成图像的HTTP缓存

时间:2015-08-27 18:48:40

标签: php apache http caching phalcon

我正在编写一个使用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 ......

这是我的原始回复标题:

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

有人看到我做错了吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

谢谢PaulS!

$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)
}

答案 1 :(得分:0)

当浏览器询问缓存的图像是否仍然有效时,您的php代码需要返回304 Not Modified标头。在脚本顶部放置一个if语句,以便在再次发送图像之前处理该请求。

您始终发送的图像就是浏览器显示200响应的原因。