Існує кілька способів кешування.
Умовно GET
Якщо ви зберігаєте ці зображення у файловій системі та обслуговуєте їх безпосередньо через веб-сервер, ви, ймовірно, вже використовуєте умовний get . Веб-сервер автоматично використовуватиме метадані файлової системи для встановлення заголовка ETAG, і автоматично відповість "304 не змінено", якщо браузер включає If-Modified-Since
або If-Matches
заголовки у своєму запиті. (Усі браузери будуть.)
У цьому випадку все зображення не подається назад, тому у вас є економія пропускної здатності. Однак GET-запит все одно буде виданий, тому ви все одно матимете накладні та затримки запиту.
Ви можете трохи зменшити кількість запитів за рахунок свіжості кешу, встановивши Cache-Control
заголовки веб-сервера зі public,max-age=N
значенням для ваших зображень. Це говорить про те, що кеші можуть зберігати ресурс не більше max-age
секунд, перш ніж вони повинні перевірити, чи оновлений він.
Однак HTTP визначає лише один спосіб визнання недійсним запису кешу, який може не відповідати семантиці вашої програми: якщо ви відправляєте POST або PUT на URL-адресу, що оновлює фотографію профілю, відповідь із Location: [url of photo]
заголовком, а запис у кеші для цього URL буде недійсним.
(Це механізм , який дозволяє кешувати веб - сторінку з коментарями, а потім сторінка примусово перезавантажувати браузер після повідомлень користувача нового коментаря. Браузер буде відповідати до POST /comment
з 303 See Other
і Location: /page/with/comment
. Зверніть увагу , що це не використовується працювати в Firefox через давню помилку .)
Якщо у вас багато трафіку, такий підхід до кешування чудово.
Зміна URL-адрес
URL - це представлення ресурсу, тому інший спосіб управління кешуванням - це не зміна параметрів кешу для ресурсу, а створення абсолютно нового ресурсу з директивою "кеш назавжди". Це підхід , що «великі хлопчики» за, тому що це дозволяє їм не генерувати НЕ додаткових запитів, зберігаючи їх великої пропускної здатності. Мінус полягає в тому, що це вимагає набагато більше додаткових бухгалтерій.
Для цього є дві загальні методи.
Рядки запиту
Веб-сервери ігнорують рядки запитів під час подання файлу з файлової системи. Кешів, однак, немає: /1.jpg?t=12345
і /1.jpg?t=67890
це два абсолютно різних, не пов'язаних між собою ресурсів, хоча сервер вважає, що вони однакові.
Отже, одна проста річ, яку ви можете зробити, - додавати часову позначку файлової системи як рядок запиту, коли ви посилаєтесь на ресурс у своєму html та встановлюєте довгий Expires
заголовок. Потім браузер буде кешувати цей ресурс назавжди і не робити жодних GET, поки рядок запиту не зміниться.
Мінусом є те, що важко або неможливо доручити веб-серверу нової URL-адреси для елемента, якщо ви хочете примусово визнати недійсним кеш. Наприклад, якщо веб-переглядач має кешовану HTML-сторінку з /1.jpg?v=1
посиланням, але стаття видалила запис /1.jpg?v=1
(можливо, у ньому не вистачає файлу чи пам’яті), він подасть новий запит на /1.jpg?v=1
. Якщо тим часом зображення змінилося на /1.jpg?v=2
, відповідна відповідь є або:
- Подайте стару версію файлу. Ви зробите це, якби хотіли, щоб усі ресурси узгоджувались один з одним, як вони були у певний момент часу. Це те, що ви повинні зробити, наприклад, з CSS-файлами, оскільки новий файл css зі старим html-файлом може не працювати належним чином!
- Перенаправлення на нову версію файлу за допомогою
301 Moved Permanently
. Ви зробили б це, якби хотіли, щоб усі ресурси були максимально новими.
І те й інше важко зробити лише з веб-сервером, а це означає, що вам потрібно викликати веб-додаток навіть для запитів зображень, які можуть бути як складнішими, так і більш ресурсомісткими. WebServers є дуже швидко в обслуговуючих файлах, тому накладні витрати веб - додатку , можуть в кінцевому підсумку ковтання пропускної здатності і латентність вигоди.
Імена файлів
Замість додавання рядка запиту ви змінюєте ім'я файлу. Це означає, що легко зберігати декілька версій файлів у файловій системі, але, ймовірно, вам потрібно буде зберігати метадані файлів та робити інший облік даних баз даних, щоб відслідковувати ваші ресурси та їх імена.