【问题标题】:Phalcon, HTTP Cache of a generated imagePhalcon,生成图像的 HTTP 缓存
【发布时间】:2023-03-28 21:26:01
【问题描述】:

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

有人知道我做错了什么吗?

提前致谢。

【问题讨论】:

标签: php apache http caching phalcon


【解决方案1】:

谢谢保罗!

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢大家!这是我的解决方案: $filemtimeOk = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $filemtime response->setStatusCode(304, "Not Modified"); $app->response->sendHeaders(); } else { // 正常情况 ... } }
    • 除非您提供特别大的内容,或者延长缓存时间,否则 304 响应会降低渲染性能,并且不会大幅减少服务器负载。
    【解决方案3】:

    如果您将 max-age 添加到最后修改日期,您将获得过去的到期时间。

    您的代码混杂了影响缓存的所有可能方式(顺便说一句,http 没有定义“pragma: cache”标头)。至于你应该做什么的问题,这取决于你想要达到的目标——只是减轻服务器的负载、更快的页面渲染或缓存到预先计划的替换或其他东西。而且你还没有告诉我们这是什么。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多