2012-03-08 8 views
1

私は、CakePHP 2.1で新しいHTTPキャッシュ機能を利用することによって、私のサイトをスピードアップしようとしています: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(); 
} 

を追加しようとしました。しかし、これは問題を解決していないよう

誰かがこれを動作させる方法を知っていますか、私は根本的に何か間違っていますか?

答えて

1

エタグキャッシングメソッドを試して、記事IDとユーザーIDに基づいてハッシュを生成できます。

は(エンティティタグと呼ばれる)のEtagヘッダを一意要求されたリソースを識別する文字列である。http://book.cakephp.org/2.0/en/controllers/request-response.html#the-etag-header

を見ますこれはファイルのチェックサムによく似ています。キャッシングは、チェックサムを比較して一致するかどうかを判断します。実際に手動で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

Iが試し$ this-> response-> etag($ this-> Article-> generateHash($ article))を使います。 'Array to string conversion'というエラーがあり、それを追求しませんでした。私はgenerateHashのためのドキュメントを見つけることができないので、私はそれをデバッグする考えがありません。 – Tomba

+0

さらに、私は、絶対に必要でない限りEtagsを使いたいと確信していません。 – Tomba

+1

独自のメソッドをgenerateHash()で実装して、特定の要件に合わせる必要があります。メソッドを実装する必要はありませんが、何とかハッシュを生成する必要があります。あなたの場合、md5($ userId。 ' - '。$ articleId)のようなものが必要です。 etagsを使用したくない場合は、とにかくハッシュキーを生成し、それをキャッシュする別の方法を見つける必要があります。また、ページ内のキャッシュされた要素と、ビュー内のユーザーに固有のページの部分のキャッシュされていない要素を使用することもできます。 – burzum

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')); 
    } 
} 
関連する問題