Jest więcej niż jeden sposób na buforowanie.
Warunkowe GET
Jeśli przechowujesz te obrazy w systemie plików i podajesz je bezpośrednio przez serwer WWW, prawdopodobnie używasz już warunkowego pobierania . Serwer WWW automatycznie użyje metadanych systemu plików, aby ustawić nagłówek ETAG, i automatycznie odpowie „304 bez modyfikacji”, jeśli przeglądarka uwzględni If-Modified-Since
lub If-Matches
nagłówki w swoim żądaniu. (Wszystkie przeglądarki będą.)
W takim przypadku cały obraz nie jest dostarczany z powrotem, więc masz oszczędności na przepustowości. Jednak żądanie GET będzie nadal wysyłane, więc nadal będziesz mieć narzut i opóźnienie żądania.
Możesz nieznacznie zmniejszyć liczbę żądań kosztem świeżości pamięci podręcznej, ustawiając Cache-Control
nagłówki z public,max-age=N
wartością dla twoich obrazów. Oznacza to, że pamięci podręczne mogą przechowywać zasób przez co najmniej max-age
sekundy, zanim będą musiały sprawdzić, czy jest on zaktualizowany.
Jednak HTTP definiuje tylko jeden sposób unieważnienia pozycji pamięci podręcznej, co może nie pasować do semantyki aplikacji: jeśli POST lub PUT na adres URL, który aktualizuje zdjęcie profilowe, odpowiedz Location: [url of photo]
nagłówkiem, a pozycja pamięci podręcznej dla tego adresu URL zostanie unieważniona.
(Jest to mechanizm, który pozwala buforować stronę z komentarzami, a następnie mieć przeładować stronę przymusowo przez przeglądarkę po postów użytkownika nowy komentarz. Przeglądarka będzie odpowiedzieć na POST /comment
z 303 See Other
a Location: /page/with/comment
Zauważ, że to nie wykorzystane. pracować w przeglądarce Firefox z powodu długotrwałego błędu ).
Jeśli nie masz dużego ruchu, to podejście do buforowania jest w porządku.
Zmiana adresów URL
Adres URL jest reprezentacją zasobu, więc innym sposobem zarządzania buforowaniem nie jest zmiana parametrów pamięci podręcznej dla zasobu, ale utworzenie zupełnie nowego zasobu z dyrektywą „buforuj na zawsze”. Takie podejście preferują „duzi chłopcy”, ponieważ pozwala im nie generować żadnych dodatkowych żądań, oszczędzając im dużą przepustowość. Minusem jest to, że wymaga znacznie więcej dodatkowej księgowości.
Są na to dwie ogólne techniki.
Ciągi zapytań
Serwery WWW ignorują ciągi zapytań podczas udostępniania pliku z systemu plików. Bufory, jednak nie należy: /1.jpg?t=12345
a /1.jpg?t=67890
to dwie zupełnie różne, niezwiązane zasoby, chociaż serwer myśli, że są takie same.
Tak więc jedną łatwą rzeczą jest dodanie znacznika czasu systemu plików jako ciągu zapytania za każdym razem, gdy odwołujesz się do zasobu w html i ustawiasz długi Expires
nagłówek. Przeglądarka będzie wówczas buforować ten zasób na zawsze i nie będzie wykonywać żadnych GET, dopóki ciąg zapytania nie ulegnie zmianie.
Minusem jest to, że trudne lub niemożliwe jest poinstruowanie serwera WWW o nowym adresie URL elementu, jeśli chcesz siłą unieważnić pamięć podręczną. Na przykład, jeśli przeglądarka ma buforowaną stronę HTML z /1.jpg?v=1
odnośnikiem, ale zdarzyło się wyczyścić wpis dla /1.jpg?v=1
(być może zabrakło miejsca na plik lub pamięć), wysyła nowe żądanie /1.jpg?v=1
. Jeśli w międzyczasie obraz się zmienił /1.jpg?v=2
, poprawną odpowiedzią jest:
- Podaj starą wersję pliku. Zrobiłbyś to, gdybyś chciał, aby wszystkie zasoby były ze sobą spójne, tak jak były w pewnym momencie. Oto co powinieneś zrobić z plikami CSS, ponieważ nowy plik css ze starym plikiem HTML może nie działać poprawnie!
- Przekieruj do nowej wersji pliku za pomocą
301 Moved Permanently
. Zrobiłbyś to, jeśli chcesz, aby wszystkie zasoby były jak nowe.
Oba są trudne do wykonania z samym serwerem WWW, co oznacza, że musisz wywołać aplikację internetową nawet w przypadku żądań obrazu, które mogą być zarówno bardziej skomplikowane, jak i bardziej wymagające zasobów. Serwery WWW bardzo szybko obsługują pliki, więc obciążenie aplikacji internetowej może w efekcie połknąć przyrost przepustowości i opóźnień.
Nazwy plików
Zamiast dodawać ciąg zapytania, zmieniasz nazwę pliku. Oznacza to, że łatwo jest przechowywać wiele wersji plików w systemie plików, ale prawdopodobnie będziesz musiał przechowywać metadane plików i wykonywać inne księgowanie bazy danych, aby śledzić zasoby i ich nazwy.