Кэшировать AJAX-запросы - PullRequest
       15

Кэшировать AJAX-запросы

7 голосов
/ 16 марта 2009

Я отправляю GJ-запросы AJAX в приложение PHP и хочу кэшировать результаты запросов для дальнейшего использования.

Поскольку я использую GET, это должно быть возможно, потому что разные запросы запрашивают разные URL-адреса (например, getHTML.php? Page = 2 и getHTML.php? Page = 5).

Какие заголовки нужно объявить в PHP-приложении, чтобы браузер клиентов правильно кэшировал содержимое URL запроса? Нужно ли мне объявлять что-либо в Javascript, который обрабатывает AJAX-запрос (я использую функцию jQuery $ .ajax с параметром кэша)?

Как бы я справился с правками, которые меняют содержание, например, getHTML.php? page = 2, чтобы клиент не вернулся к кэшированной версии? Добавление другого параметра в запрос GET, например, getHTML.php? page = 2 & version = 2 невозможна, поскольку ссылка на запрошенный URL-адрес создается автоматически без какой-либо проверки (что желательно, так, как я хочу).

Как будет реагировать браузер, когда я пытаюсь AJAX-запросить URL-адрес кэшированного запроса? Будет ли AJAX-запрос немедленно возвращать успех?

Спасибо

Willem

Ответы [ 2 ]

9 голосов
/ 06 мая 2010

Добавьте следующие заголовки на сервер:

    header("Cache-Control: private, max-age=$seconds");
    header("Expires: ".gmdate('r', time()+$seconds));

Где $ секунд имеет очевидное значение.

Кроме того, проверьте, не выдает ли ваш сервер некоторые другие заголовки анти-кэширования, такие как Pragma. Если это так, добавьте заголовок «Pragma: cache».

3 голосов
/ 16 марта 2009

Как только вы обновите страницу, вы по-прежнему будете делать запросы к контенту на сервере, даже если вы запрашивали их раньше. Заголовки PHP не помогут вам в этом.

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

Для этого варианта использования вы можете использовать хеш-таблицу в JavaScript и запросить ее перед тем, как позвонить на сервер. Это улучшит взаимодействие с пользователем, поскольку пользователю не придется ждать другого запроса контента, который он уже видел.

Вот пример:

//placeholder for hash table as cache
var cache = [];

var getPage = function(pageNr){
    if(cache[pageNr]){
        //content is already in cache, use it from there
        handleContent(cache[pageNr]);
    }
    else{
        //object with parameteres sent with GET request
        var params = {};
        params.page = pageNr;

        $.ajax({
          url: "getHTML.php",
          data: params,
          cache: false,
          success: function(response){
            //handle your response here
            handleContent(response);

            //store the response in the cache for later use
            cache[pageNr] = response;
          }
        });
    }
};

Теперь запрашивающие страницы сначала заглянут в текущий кеш, чтобы узнать, есть ли у вас контент. Если нет, он выполнит вызов сервера и сохранит ответ в кеше.

Это похоже на взаимодействие с пользователем при просмотре новостей в Google Finance

ОБРАТИТЕ ВНИМАНИЕ, что при обновлении страницы этот кэш будет удален.

В случае редактирования страницы вам нужно будет использовать ссылки Мориса Перри на Yahoo Exceptional Performance, чтобы ваш сервер всегда возвращал вашу последнюю версию контента.

Подробнее о хеш-таблицах в JavaScript: http://www.mojavelinux.com/articles/javascript_hashes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...