2016-10-11 8 views
1

PHPでREST APIをゼロから構築していますが、これはうまく機能していますが、今はヘッダーに関連するキャッシュを処理したいので、持ってる。以前にキャッシュされたレスポンスの部分的な更新

レストサービスのすべてのエンティティはデータベーステーブルにリンクされており、私が使用しているアプローチはすべてのテーブルの作成/更新されたフィールドなので、すべてのリソース要求に "Last-modified"ヘッダーを提供できます。私だけが要求を処理しますどのように、これは応答を生成するコードの一部である、と私はそれをより明確にするために、ヘッダ

switch(strtolower($requestMethod)){ 
... 
case "get":{ 
    if ($resourceId){ 
     $this->resource = $resourceType::byId($resourceId); 
     if (!$this->resource){ 
      $this->responseCode = 404; 
     } 
     else{ 
      $this->responseBody = json_encode($this->resource); 
      $this->responseCode = 200; 
      $this->responseHeaders["Content-Type"] = "application/json; charset=UTF-8"; 
     } 
    } 
    else{ 
     $this->responseBody = json_encode($resourceType::find($this->requestData)); 
     $this->responseCode = 200; 
     $this->responseHeaders["Content-Type"] = "application/json; charset=UTF-8"; 
    } 
} 
break; 
... 
} 

を「最終更新日」を追加する予定のそれを明確にする

/api/products/products/products/products/index.htmlのようなリクエストがあります。

キャッシュのために、$ resourceIdが存在する場合は、単に "Last-modified"ヘッダーを最後に更新されたタイムスタンプ。

$ resourceIdがない場合は、コレクション内で最も更新されたタイムスタンプをクエリし、最後に変更したヘッダーとして配置します。

この最後のポイントは私が問題があるところです。データベースに20000の製品があり、1つの製品の価格を更新するとしましょう。これは、更新後にapi/productsへのリクエストがデータの1バイトだけが変更されているにもかかわらず、20000個のアイテムを再度取得しなければならないことを意味し、ブラウザにフェッチすべきことを伝える方法があるかどうかを知りたいレコードを1つだけ作成し、そのキャッシュを更新します。

初めてのRESTサービスです。投稿したコードのアドバイスは大歓迎です。

ありがとうございます。

答えて

0

サーバーサイドキャッシュを実装できます。管理が簡単です。 PHPデータベーステーブルを作成し、テーブルにAPIレスポンスを格納することができます。また、memcacheサーバーを使用してapiの応答をキャッシュすることもできます

+0

申し訳ありませんが、私は私が尋ねた質問にどのように役立つか分かりません。キャッシュされたものはすでに完了しており、うまく動作しています。また、更新されたレコードを簡単に識別できます。クライアントキャッシュの部分的な更新はできません。 – sergio0983

1

ブラウザに、1つのレコードのみをフェッチしてキャッシュを更新するように指示する方法があるかどうかを知りたいのですが。

いいえ、すべてのレコードで1つのリソースを提供しているわけではありません。

ブラウザキャッシュは、別々の製品の別々の有効期限を管理していますが、ブラウザに差分を返すための一般的なメカニズムはありません。

Atomフィードのポーリング時に本質的に同じ問題が発生するため解決策が提案されています(例:Vary: ETag)。しかし、これらの手法を認識しているクライアントが必要です。

メインリソースのサイズを小さくするか、すべての変更時に配信されることに同意してください。

+1

あなたの答えをありがとう、私は1つのページが10Mの情報を含むことができ、すべての要求に新しい負荷を受け入れることができないので、代わりのアプローチを考える必要があります。おそらくページで取り出すとこれを少し楽にすることができますか? – sergio0983

+0

はい。ページ単位で分割することで、一部のリソースだけが無効になるだけで、キャッシュの再利用を増やすことができます。 – Joe

関連する問題