2012-03-08 4 views
1

Я пытаюсь ускорить свой сайт, воспользовавшись новыми функциями кэширования HTTP в CakePHP 2.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')); 
    } 
} 

Кэширование работает отлично, но не делает различий между разными пользователями (т.е. если пользователь входит в систему и посещает страницу, которая уже была кеширована, отображается предыдущая кэшированная страница, а контент для конкретного пользователя не отображается). Я хотел бы одно из следующих действий произойдет:

  • Cache различение между различными пользователями и сохраняет отдельный кэш для каждого пользователя
  • Кэширование отключена, если пользователь вошел в систему (Логин пользователя используется только для цели администратора)

Я попытался добавить

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

Но это не похоже, чтобы решить эту проблему

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

ответ

1

Вы можете попробовать метод кэширования 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

Я попытался используя $ this-> response-> etag ($ this-> Article-> generateHash ($ article)); но получил ошибку «Array to string conversion» и не преследовал ее. Я не могу найти какую-либо документацию для generateHash, поэтому я понятия не имею, чтобы ее отлаживать. – Tomba

+0

Кроме того, я не уверен, что хочу использовать Etags, если это абсолютно необходимо. – Tomba

+1

Вы должны реализовать метод generateHash() самостоятельно, чтобы соответствовать вашим конкретным требованиям. Вам даже не нужно реализовать этот метод, но вам нужно создать хэш - так или иначе. В вашем случае вам нужно что-то вроде md5 ($ userId. '-'. $ ArticleId); Если вам не нравится использовать etags, вам все равно нужно создать хеш-ключ и найти другой способ его кеширования. Вы также можете использовать кешированные элементы на странице и не кешированные элементы для частей страницы, которые являются специфическими для пользователя в представлении. – burzum

0

Я думал, что я отправлю решение (s) В конце концов я использовал, в случае, если это помогает кому угодно.

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

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')); 
    } 
} 
Смежные вопросы