1

我正在尝试通过利用 CakePHP 2.1 中新的 HTTP 缓存功能来加速我的网站:

class ArticlesController extends AppController {
    public function view($id) {
        $article = $this->Article->find(
            'first',
            array('conditions' => array('Article.id' => $id))
        );

        $this->response->modified($article['Article']['modified']);
        $this->set(compact('article'));
    }
}

缓存工作正常,但不区分不同的用户(即,如果用户登录并访问已经缓存的页面,则显示先前缓存的页面,并且不显示用户特定的内容)。我希望发生以下情况之一:

  • 缓存区分不同的用户,并为每个用户存储单独的缓存
  • 如果用户登录,缓存将被禁用(用户登录仅用于管理目的)

我试过添加

if (AuthComponent::user('id')) {
    $this->disableCache();
}

但这似乎并不能解决问题

有谁知道如何让它工作,或者我做错了什么?

4

2 回答 2

1

您可以尝试使用 etag 缓存方法并根据文章 ID 和用户 ID 生成哈希。

http://book.cakephp.org/2.0/en/controllers/request-response.html#the-etag-header

Etag 标头(称为实体标签)是唯一标识请求资源的字符串。它非常类似于文件的校验和,缓存将比较校验和以判断它们是否匹配。

要真正利用此标头,您必须手动调用 CakeResponse::checkNotModified() 方法或将 RequestHandlerComponent 包含在控制器中:

<?php
public function index() {
    $articles = $this->Article->find('all');
    $this->response->etag($this->Article->generateHash($articles));
    if ($this->response->checkNotModified($this->request)) {
        return $this->response;
    }
    ...
}
于 2012-03-08T15:35:33.237 回答
0

我想我会发布我最终使用的解决方案,以防它帮助任何人。

要为登录用户完全禁用缓存:

class ArticlesController extends AppController {
    public function view($id) {
        $article = $this->Article->find(
            'first',
            array('conditions' => array('Article.id' => $id))
        );

        if (!AuthComponent::user('id')) {
            $this->response->etag($this->Article->generateHash($article));
        }

        $this->set(compact('article'));
    }
}

为每个用户(以及没有人登录的情况)设置单独的缓存:

class Article extends AppModel {
    public function generateHash($article) {
        if (AuthComponent::user('id')) {
            return md5(AuthComponent::user('id') . '-' . $article['Article']['modified']);
        } else {
            return md5($article['Article']['modified']);
        } 
    }   
}

class ArticlesController extends AppController {
    public function view($id) {
        $article = $this->Article->find(
            'first',
            array('conditions' => array('Article.id' => $id))
        );

        $this->response->etag($this->Article->generateHash($article));

        $this->set(compact('article'));
    }
}
于 2012-03-16T14:34:28.883 回答