Php Phalcon,生成图像的HTTP缓存

Php Phalcon,生成图像的HTTP缓存,php,apache,http,caching,phalcon,Php,Apache,Http,Caching,Phalcon,我正在编写一个web服务,它使用Phalcon生成图像的拇指 我尝试HTTP缓存它 这是我的代码: $seconds = 43200; $expireDate = new DateTime(); $expireDate->modify("+ $seconds seconds"); $finfo = new finfo(FILEINFO_MIME_TYPE); $app->response->setHeader('Content-Type', 'Content-type: '

我正在编写一个web服务,它使用Phalcon生成图像的拇指

我尝试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
有人知道我做错了什么吗


提前感谢。

如果您将最大年龄添加到上次修改的日期,您将获得过去的到期时间


您的代码是影响缓存的各种可能方式的混乱(顺便说一句,http没有定义“pragma:cache”头)。至于你应该做什么的问题,这取决于你想要实现什么——仅仅是从服务器上卸载,更快的页面呈现,或者缓存到一个预先计划好的替换或者其他什么。您还没有告诉我们这是什么。

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

您总是发送图像,这就是浏览器显示200响应的原因。

谢谢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)
}
$filemtimeOk=isset($\u服务器['HTTP\u IF\u MODIFIED\u SINCE'])&&&$filemtime response->setStatusCode(304,“未修改”);
$app->response->sendHeaders();
}否则{
//正常情况…(发送数据和标题)
}

Try我只需遵循本教程:是的,当然,我也尝试使用缓存从服务器上加载并加快客户端渲染,这是缓存定义否?顺便说一句,pregma缓存头存在于HTTP中,但仅存在于HTTP/1.0实现中。谢谢但同样的结果没有。教程没有说“使用所有这些”。“Pragma:cache”也不在HTTP 1.0中。看一看(介绍性)或(高级)谢谢大家!这是我的解决方案:$filemtimeOk=isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])&&&$filemtime response->setStatusCode(304,“未修改”)$应用程序->响应->发送头();}否则{//Normal case…}}除非您正在提供非常大的内容或延长缓存时间,否则304响应将恶化渲染性能,并且不会大幅降低服务器上的负载。