Частичное обновление ранее кэшированных ответов

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

Каждая сущность в службе отдыха связана с таблицей базы данных, и подход, который я использую, заключается в создании / обновлении поля в каждой таблице, поэтому я могу подавать заголовок «Последние изменения» при каждом запросе ресурса.

Только чтобы прояснить, как мне обрабатывать запросы, это фрагмент кода, который генерирует ответ, и где я планирую добавить заголовок «Последнее изменение»

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 будет равен products, а $ resourceId будет равен 1.

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

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

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

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

Спасибо.

1

Решение

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

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

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

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

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

1

Другие решения

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

0