Javascript.RU

Технология Cache Saver или сохраняем данные в кэше

Когда речь доходит до способов сохранения данных на стороне клиента, решение сводится либо к использованию возможностей отдельных браузеров (часть из которых, например Opera, их вообще не имеет), либо к применению Flash/Java. Все три подхода имеют свои минусы. Первый вполне очевиден. Наша библиотека должна содержать код под каждый браузер в отдельности, заботиться об некоем общем универсальном формате хранения данных. При этом старые версии браузеров идут лесом. В случае Flash/Java должен быть установлен соответствующий плагин или JavaVM. Кроме того, многие полезные скрипты позволяют блокировать флэш анимацию.

Мы же поговорим о 4-м способе: хранении данных в кэше браузера. Сразу оговорюсь, только средствами javascript обойтись не удастся, понадобится поддержка сервера (в моём примере использован php).

Хранить данные можно в любом формате, для своей цели я выбрал js. Задачей было разрешить пользователям форума использовать свои собственные скрипты/панели кнопок. При этом, разумеется, первостепенное внимание должно было быть уделено вопросу безопасности.
Итак, есть страничка, позволяющая пользователю загрузить/сохранить скрипт в кэш. Данный скрипт будет автоматически загружаться при заходе на форум.

Теория.
1) Пользователь вводит текст скрипта на страничке js.html, нажимает SAVE. Идёт запрос к скрипту /js.php с содержимым текста.
2) js.php сохраняет текст в сессии, получает текущий stamp времени через функцию time() и генерирует выходное имя скрипта: ...js.php/[time()].js. В выходной поток отправляется код, который обратится по данному адресу:

.....
<script src="js.php/137345453.js"></script>

3) js.php анализирует запрос и если там присутствует текст ".js", то считает, что клиент обращается за данными, сохранёнными в сесии. Данные достаются из оной, клиенту посылаются заголовки:

Header('Content-type: text/javascript');
Header('Expires: '.GmDate('D, d M 2020 H:i:s').' GMT');

Обратите внимание на год 2020. Фактически, мы говорим браузеру, что отдаём ему документ, который не изменится до 2020-го года, а значит его нужно сохранить в кэш и постоянно брать оттуда. Все последующие обращение к js.php/[слепок времени].js будут приводить к обращению к кэшу. Сервер же после первого обращение очищает файл сессии.

Кроме содержимого скрипта js.php посылает также заголовок с кукисом, содержащим тот самый слепок времени (time()), чтобы форум мог взять данные из кукиса и сгенерировать путь к скрипту.

В целом такая реализация имеет ряд существенных минусов.
1) Мы не можем управлять настройками кэша пользователя. Если кэш постоянно очищается или вообще не сохраняется, то второй запрос к js.php приведёт к выдаче пустого содержимого.
2) Необходим серверный скрипт (в нашем случае js.php)
3) Нет гарантий по поводу того, сколько проживут данные в кэше. Может быть день, может два, может месяц.

Есть и плюсы.
1) Нет необходимости хранить все данные в БД или в файлах на сервере, в результате чего резко сокращается нагрузка на оборудование.
2) Загрузка данных из кэша происходит почти мгновенно.

Для того, чтобы пользователь не потерял однажды содержимое скрипта при очистке кэша, при сохранении текста ему предлагается скачать результат в виде файла. При этом "скачивание" на самом деле ведётся с кэша.

Безопасность.
Серверная сторона должна проверять метод запроса (POST/GET) и реферера, чтобы скрипт на вредоносном сайте не мог сохранить в кэш что угодно.

Вторичное сохранение. Так как имя скрипта генерируется функцией time(), возвращающей время в секундах, то такое имя практически всегда будет уникальным для браузера.

+2

Автор: Гость (не зарегистрирован), дата: 9 июля, 2009 - 09:53
#permalink

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

И к тому же, насколько сильно снизится нагрузка? ИМХО экономия на спичка. Если вам дорог лишний запрос, то легче вставить в саму страницу этот JS.


Автор: Berserker, дата: 9 июля, 2009 - 15:51
#permalink

В таком случае пришлось бы держать копии скриптов на сервере или в БД. Согласен, зато стабильно. Но я сделал немного иначе. У кого проблемы с кэшем (у меня тоже автоматическая очистка), те используют стандартный встроенный скрипт и панель кнопок.
А вообще это скорее эксперимент или альтернативный вариант. Например, можно сделать временное кэширование страниц сайта, построенного на ajax. Всё, что не загружается, сохраняется в кэш. Свои кнопки "вперёд"/"назад" мгновенно достают нужную информацию. Так что вопрос лишь в сфере применения.


Автор: Gozar, дата: 3 сентября, 2009 - 19:52
#permalink

Велосипед с тремя педалями, одна из которых то работает, то нет.


Автор: Гость (не зарегистрирован), дата: 8 октября, 2011 - 18:48
#permalink

Решение с кэшем неудачное, т.к. браузер может решить что нужно загрузить скрипт опять, что отправляет лесом все наши потуги.
Статье уже два года. За эти два года всё поменялось.
Сейчас лучше использовать localStorage - лесом идут только старые версии ie, в остальных браузерах обновление более автоматизированно (иногда даже почти принудительное).


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 01:27
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 12:46
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
13 + 3 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
Berserker
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum