2016-10-11 2 views
1

Я создаю REST API в php с нуля, получил его работу, и теперь я хочу обрабатывать кеш, связанные с заголовками, поэтому клиентам не нужно снова и снова запрашивать ресурсы, которые они уже иметь.Частичное обновление ранее кэшированных ответов

Каждый объект службы останова связан с таблицей базы данных, и подход, который я использую, является созданным/обновленным полем для каждой таблицы, поэтому я могу обслуживать заголовок «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/1 $ resourceType будет по продуктам, а $ resourceId будет равняться 1.

Теперь, для кэширования, если присутствует $ resourceId, я просто добавлю заголовок «Last-modified» с его последняя обновленная временная метка.

В случае отсутствия $ resourceId я бы запросил самую высокую обновленную временную метку в коллекции и поместил ее в качестве последнего измененного заголовка.

Последнее, что у меня есть проблема. Предположим, что у меня есть 20000 продуктов в моей базе данных и обновляется цена одного; это означало бы, что запрос на api/products после обновления должен будет снова извлечь 20000 элементов, хотя только один байт данных был изменен, и я хочу знать, есть ли способ сообщить браузеру, что он должен получить только одна запись и обновить ее кеш.

Это моя первая служба REST, выполненная с нуля, поэтому любые советы по кусочку кода, который я разместил, приветствуются.

спасибо.

ответ

0

Вы можете реализовать кеш на стороне сервера. Его легче управлять. Вы можете создать таблицу базы данных php и сохранить ответ api в таблице. Вы также можете использовать сервер memcache для кеширования ответа api

+0

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

1

Я хочу знать, есть ли способ сообщить браузеру, что он должен извлекать только одну запись и обновлять ее кеш.

Нет, если вы обслуживаете единственный ресурс со всеми записями.

Кеши браузера рады управлять отдельными сроками истечения срока действия для отдельных продуктов, но нет единого механизма отправки diff обратно в браузер.

Решения были предложены (например, Vary: ETag), поскольку по существу такая же проблема возникает при опросе для каналов Atom, но для этого требуется клиент, который знает об этих методах.

Либо уменьшите размер основного ресурса, либо согласитесь, что он будет обслуживаться при каждом изменении.

+1

Спасибо за ваш ответ, я должен подумать об альтернативном подходе, потому что одна страница может содержать 10 М информации, и это не приемлемо для нового запроса на каждый запрос; возможно, выборка по странице может немного облегчить это? – sergio0983

+0

Да; разбиение по страницам, так что только некоторые ресурсы являются недействительными, было бы хорошим способом разрешить повторное использование кеша. – Joe

Смежные вопросы