使用CakePhp中的response-> file()缓存发送的图像

时间:2013-10-07 20:31:32

标签: php cakephp caching

我已经为服务器实现了媒体视图,否则保护图像。控制器处理请求并检查权限,并相应地为文件提供$this->response->file

但是,我还没有设法缓存图像,迫使浏览器总是重新下载(我从Firebug的Net面板知道这一点)。这些文件不太可能改变,因此缓存会大大加快速度。

我玩过$this->response->modified()cache(),但无济于事。

如何在控制器操作中实施检查以服务器文件或未修改的状态代码?还是我离开这里?

任何帮助表示赞赏! :)

public function view($id)
{
    $this->loadModel('Image');
    $res = $this->Image->hasAccess($id, $this->Auth->user('subject_id'));

    if($res['access'] || $this->isAdmin()){
        $modified =  gmdate("D, j M Y G:i:s ", filemtime ( APP . "Content/Images/" . $res['file']));
        $this->response->modified($modified);
        $this->response->expires(time() + 60 * 60 * 24 * 31);

        $this->response->file( APP . "Content/Images/" . $res['file']);

    }else if($res['access'] === false){
        $this->response->statusCode(403);
    }else if($res['access'] === null){
        $this->response->statusCode(404);
    }

   return $this->response;
}

2 个答案:

答案 0 :(得分:2)

我认为更好的解决方案是在你的vhost文件中添加标题,例如如果你使用nginx:

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
  expires 1y;
  log_not_found off;
}

这个解决方案更好,因为下次nginx不会使用php将文件发送给用户。

答案 1 :(得分:1)

使用CakeResponse::modified()设置文件的修改时间,然后使用CakeResponse::checkNotModified()检查用户代理是否具有文件的有效缓存版本。

$response->modified(filemtime($file));
if($response->checkNotModified($this->request))
{
    return $response;
}

另见http://book.cakephp.org/2.0/en/controllers/request-response.html#the-last-modified-header