CakePHP 2.1 HTTP-кеш - PullRequest
       35

CakePHP 2.1 HTTP-кеш

1 голос
/ 08 марта 2012

Я пытаюсь ускорить свой сайт, используя новые функции кэширования HTTP в CakePHP 2.1:

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();
}

Но, похоже, это не решает проблему

Кто-нибудь знает, как заставить это работать, или я делаю что-то в корне неправильно?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вы можете попробовать метод кэширования etag и сгенерировать хеш на основе идентификатора статьи и идентификатора пользователя.

См. 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;
    }
    ...
}
0 голосов
/ 16 марта 2012

Я думал, что опубликую решение (я), которое я в конечном итоге использовал, на случай, если оно кому-нибудь поможет.

Чтобы полностью отключить кэширование для зарегистрированных пользователей:

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'));
    }
}
...