...

Hierarchie buforowania: opcode, strona, przeglądarka i edge - efektywne wykorzystanie wszystkich poziomów dla optymalnej wydajności

Hierarchie buforowania zapewniam najszybsze czasy ładowania, gdy używam każdej warstwy z osobna: opcode, page, browser i edge. Pokazuję w jasnych krokach, jak łączę te warstwy, unikam konfliktów i ustawiam konfiguracje w taki sposób, że żądania są krótsze, a TTFB jest wyraźnie zmniejszone.

Punkty centralne

Aby upewnić się, że przegląd jest jasny, najpierw podsumowuję główne tematy i dostosowuję je bezpośrednio do celów wydajności. Wyjaśniam wszystkie poziomy z konkretnymi ustawieniami, aby implementacja przebiegła pomyślnie bez objazdów. Wyraźnie rozgraniczam dynamiczne części, aby zachować personalizację. Optymalizuję nagłówki i klucze pamięci podręcznej, aby nie było niepotrzebnych odpadów w pamięci podręcznej. Wreszcie, łączę wszystko w ścisły łańcuch, aby każde pobieranie odbywało się najszybszą drogą.

  • Opcode przyspiesza PHP
  • Pamięć podręczna strony skrócony TTFB
  • Browser Oszczędność przepustowości
  • Krawędź Zmniejsza opóźnienia
  • Orkiestracja Zapobiega konfliktom

Co właściwie oznacza „hierarchia buforowania“?

Rozumiem przez Hierarchia rozłożone w czasie buforowanie od rdzenia serwera do urządzenia końcowego. Każda warstwa odpowiada na inne pytanie: czy serwer musi ponownie skompilować kod, czy PHP musi ponownie wyrenderować stronę, czy przeglądarka musi ponownie załadować zasoby, czy też węzeł brzegowy dostarcza gotową zawartość blisko użytkownika. Unikam powielania pracy poprzez harmonizację poziomów i przypisywanie jasnych obowiązków. W ten sposób zmniejszam obciążenie procesora, zapytania zaplecza i opóźnienia sieciowe bez utraty funkcjonalności. Krótkie wprowadzenie do poziomów można znaleźć w tym kompaktowym przewodniku: Proste poziomy buforowania.

Opcode caching: natychmiastowe przyspieszenie PHP

Na stronie Opcode-caching, przechowuję skompilowany kod bajtowy PHP w pamięci RAM i oszczędzam sobie wielokrotnego parsowania. Przyspiesza to każde żądanie, które dotyka PHP, zwłaszcza obciążenia CMS, takie jak WordPress. Włączam OPcache i wymiaruję pamięć na tyle hojnie, że często używane skrypty nigdy nie są wypierane. Ustawiam umiarkowaną rewalidację, aby zmiany były widoczne natychmiast, bez zbyt częstego sprawdzania. W ten sposób zauważalnie zmniejszam zarówno obciążenie procesora, jak i czasy odpowiedzi.

Celowo ustawiam typowe parametry OPcache w php.ini zachowawczo, monitoruję współczynnik trafień i dostosowuję w razie potrzeby. Utrzymuję liczbę akcelerowanych plików na wystarczająco wysokim poziomie, aby projekt zmieścił się w całości. Używam wstępnego ładowania dla centralnych klas, aby nawet zimne starty działały szybciej. Wdrażam zmiany z resetem pamięci podręcznej, aby uniknąć ryzyka niespójnych stanów. Używam bloku konfiguracji jako punktu wyjścia, a nie sztywnego dogmatu.

opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=2

Regularnie sprawdzam OPcache-statystyki, ponieważ tylko pomiar pokazuje, czy pamięć podręczna jest nośna, czy nie. Hostowanie pulpitów nawigacyjnych lub stron stanu PHP pomaga mi zminimalizować liczbę pominięć. Unikam zbyt małych wartości pamięci, które prowadzą do eksmisji. Unikam również rzadkiej walidacji, aby produktywne zmiany nie utknęły. Dzięki tej równowadze pracuję wydajnie i bezpiecznie.

Buforowanie stron: HTML bez czasu oczekiwania

Na stronie Pamięć podręczna strony Zapisuję gotowy HTML tak, że PHP i baza danych nie są już w ogóle uruchamiane. To drastycznie zmniejsza TTFB i przynosi największe skoki pod obciążeniem. Konsekwentnie wykluczam spersonalizowane ścieżki, takie jak koszyk, kasa i konta użytkowników. Jednocześnie hermetyzuję małe dynamiczne części za pomocą AJAX lub edge-side includes, aby reszta mogła pochodzić z pamięci podręcznej. Dzięki temu strona działa szybko, nie tracąc przy tym swojej indywidualności.

Decyduję, czy użyć buforowania na poziomie serwera, czy pracować z wtyczką. Na serwerze osiągam najlepsze wyniki Opóźnienie, Wtyczki dają mi elastyczną kontrolę w CMS. Mechanizmy wstępnego ładowania wstępnie wypełniają pamięć podręczną, dzięki czemu początkowe wywołania nie czekają. Podczas aktualizacji treści usuwam osierocone wpisy za pomocą reguł oczyszczania. W przypadku szczególnie kosztownych obszarów łączę również pamięć podręczną obiektów, aby dostęp do bazy danych był rzadszy.

Buforowanie przeglądarki: przechowuj zasoby lokalnie

Na stronie Browser-Pozostawiam statyczne pliki, takie jak obrazy, CSS i JS w lokalnej pamięci podręcznej. Powracający odwiedzający prawie nic nie ładują, a serwer pozostaje wolny. Ustawiam długie wartości max-age dla niezmiennych zasobów, które dostarczam z wersjonowaniem nazw plików. Dodaję krótkie czasy lub must-revalidate do dynamicznych punktów końcowych, aby aplikacja pozostała aktualna. W ten sposób zmniejszam przepustowość i optymalizuję postrzeganą prędkość.

Zwracam uwagę na czyste połączenie kontroli pamięci podręcznej, ETag i last-modified. W przypadku niezmiennych plików ustawiam niezmienność, aby przeglądarka nie sprawdzała ich niepotrzebnie. W przypadku zasobów z częstymi aktualizacjami używam żądań warunkowych za pośrednictwem ETag. Unikam niejednoznacznych nagłówków, ponieważ sprzeczne sygnały prowadzą do nieporozumień. Zachowuję kontrolę bezpośrednio na serwerze internetowym lub za pośrednictwem wtyczki CMS, w zależności od środowiska.

Buforowanie brzegowe: bliskość użytkownika

O Krawędź-Dostarczam treści w globalnych punktach PoP, co minimalizuje opóźnienia i wygładza szczyty. HTML, obrazy i API mogą być serwowane blisko użytkownika w zależności od zestawu reguł. Pracuję z kluczami pamięci podręcznej, które zawierają tylko niezbędne zmienne, aby zminimalizować fragmentację. Reguły takie jak stale-while-revalidate i stale-if-error zapewniają, że użytkownicy natychmiast zobaczą poprawną kopię, nawet jeśli Origin dopiero się rozgrzewa. Międzynarodowe grupy docelowe odnoszą szczególne korzyści, ponieważ czasy routingu są zauważalnie krótsze.

Oddzielam warianty, gdy strona mobilna i desktopowa bardzo się różnią. Celowo pomijam obszar kasy i konta na krawędzi, aby uniknąć kolizji z sesjami i plikami cookie. Regularnie sprawdzam wskaźnik trafień i dostosowuję TTL, aż do osiągnięcia optymalnych kursów. Praktyczne i dogłębne spojrzenie na tę kwestię Przewodnik po buforowaniu brzegowym z naciskiem na opóźnienia i ścieżki sieciowe. Mam pod ręką czyste strategie oczyszczania, dzięki czemu aktualizacje wchodzą w życie natychmiast na całym świecie.

Poprawne ustawienie nagłówka HTTP

Die Nagłówek kontrolować, jak daleko treść może podróżować i kiedy jest ponownie sprawdzana. Używam kontroli pamięci podręcznej do określania widoczności, czasu życia i obowiązków ponownej walidacji. ETag jednoznacznie identyfikuje zasób i umożliwia żądania if-none-match. Last-Modified zapewnia rezerwę dla klientów, którzy ignorują ETag. Utrzymuję jasną kombinację, aby klient, CDN i źródło miały te same oczekiwania.

Używam poniższego przeglądu jako praktycznego odniesienia podczas konfiguracji. Sprawdzam każdą linię pod kątem typu zasobu i zachowania zmiany. W przypadku plików statycznych ustawiam długie wartości maksymalnego czasu trwania z niezmiennymi. W przypadku często aktualizowanej zawartości skracam czas trwania i polegam na żądaniach warunkowych. Dzięki temu ścieżka danych jest wydajna i poprawna.

Nagłówek Funkcja
Kontrola pamięci podręcznej Kontroluje czas trwania, widoczność, ponowną walidację (np. max-age, public, must-revalidate).
ETag Unikalny identyfikator wersji, podstawa dla wywołań warunkowych
Ostatnio zmodyfikowany Znacznik czasu jako alternatywa dla ETag, używany do walidacji

Strategie unieważniania i odświeżania pamięci podręcznej

Planuję Unieważnienie równie starannie jak samo buforowanie. Selektywne czyszczenie według ID, tagu lub ścieżki zapobiega pełnemu czyszczeniu, które powoduje koszty. Podczas wdrażania usuwam tylko to, co naprawdę się zmieniło. Stale-while-revalidate zapewnia użytkownikom szybkość, podczas gdy tło ładuje świeże kopie. Stale-if-error wyłapuje błędy w Origin bez pogarszania komfortu użytkowania.

Łączę krótki TTL z wysokim współczynnikiem trafień, jeśli zawartość często się zmienia. W przypadku archiwów, multimediów i bibliotek wybieram długie czasy, wersje nazw plików i usuwam obciążenia kontrolne. Pulpity nawigacyjne po stronie CDN lub serwera pokazują mi, gdzie wiadra pamięci podręcznej są zbyt małe. Następnie dostosowuję liczbę slotów i rozmiary obiektów. To ciągłe dostrajanie robi różnicę w codziennym życiu.

Klucze pamięci podręcznej, pliki cookie i Vary

Z wąskim Klucze Utrzymuję niewielką liczbę wariantów. Tylko parametry, które naprawdę zmieniają wynik, trafiają do klucza. Celowo używam nagłówków Vary, na przykład po klasach Accept-Encoding lub User-Agent, jeśli to konieczne. Zbyt wiele plików cookie w kluczu rozbija pamięć podręczną i zmniejsza współczynnik trafień. Czyszczę nieużywane pliki cookie i reguluję parametry, które są używane do śledzenia poza kluczem.

Jeśli muszę zmieniać języki, waluty lub układy, używam określonych kluczy, takich jak lang=de lub currency=EUR. Ograniczam tę różnorodność do przypadków, których naprawdę potrzebuję. W przypadku testów A/B oddzielam tylko te segmenty, które różnią się zawartością. Wszystkim innym zarządzam po stronie klienta lub za pomocą logiki krawędziowej bez eksplozji kluczy. W ten sposób utrzymuję wydajność globalnej pamięci podręcznej.

Pamięć podręczna obiektów i stany nieustalone

A Obiekt-Cache redukuje kosztowne zapytania do bazy danych poprzez przechowywanie wyników w pamięci. W przypadku WordPressa wybieram Redis lub Memcached, aby zapewnić szybki dostęp do często żądanych opcji, zapytań i sesji. Używam stanów przejściowych do tymczasowego przechowywania kosztownych obliczeń. Czyszczę te wartości podczas wdrażania, gdy zmieniają się zależności. Dzięki temu strona jest dynamiczna i nadal szybka.

To porównanie pomaga mi w przypadku projektów o dużych rozmiarach z dużym obciążeniem danymi: Redis vs Memcached. Tam rozpoznaję typowe mocne strony obu systemów w zależności od obciążenia. Wymiaruję pamięć RAM i sprawdzam strategie eksmisji, aby zrobić miejsce dla rzadko używanych obiektów. Monitorowanie współczynników trafień/pudeł pokazuje, czy konfiguracja działa. Ten poziom idealnie uzupełnia pamięć podręczną stron.

Połączenie: zoptymalizowany łańcuch

Łączę Poziomy dzięki czemu każde żądanie odbywa się najkrótszą ścieżką. OPcache przyspiesza generowanie, gdy HTML jest faktycznie tworzony. Pamięć podręczna strony zapewnia gotowe znaczniki dla anonimowych odwiedzających. Buforowanie przeglądarki zapobiega wielokrotnemu przesyłaniu zasobów, a Edge dystrybuuje zawartość globalnie. Na samym końcu znajduje się czysta strategia czyszczenia i wersjonowania, dzięki czemu aktualizacje wchodzą w życie natychmiast.

Trzymam poniższą tabelę pod ręką jako ściągawkę, gdy zmieniam ustawienia. Kolumnę „Konfiguracja“ czytam jak listę rzeczy do zrobienia podczas wdrażania. Upewniam się, że poziomy wzajemnie się uzupełniają i nie znoszą. Dzięki temu ogólna architektura jest przejrzysta i wydajna. Taki przegląd zapobiega błędom podczas planowania.

Poziom pamięci podręcznej Przewaga Typowa zawartość Konfiguracja
Opcode Szybkie wykonywanie PHP Kod bajtowy PHP php.ini, Panel serwera
Strona Niski poziom TTFB Ukończony HTML Poziom serwera lub wtyczki
Browser Lokalne ponowne użycie CSS, JS, obrazy Nagłówek HTTP, wersjonowanie
Krawędź Globalna bliskość HTML i zasoby Zasady CDN, klucze, czyszczenie

Pomiar: TTFB, LCP i liczba trafień

Mierzę TTFB, aby zobaczyć, jak szybko pojawia się pierwszy bajt. LCP pokazuje mi, czy widoczna zawartość pojawia się na czas. Używam analizy pamięci podręcznej do sprawdzania wskaźników trafień i rozpoznawania tras, w których gromadzą się braki. Koreluję metryki z wdrożeniami, obciążeniem crawlerów i szczytami ruchu. Tylko liczby pokazują, gdzie muszę dokręcić śruby.

Rejestruję nagłówki odpowiedzi, takie jak wiek i stan pamięci podręcznej CF, aby wizualizować sukcesy krawędzi. Dzienniki serwera informują mnie, czy pamięć podręczna strony działa prawidłowo. Jeśli występują duże odchylenia, szukam plików cookie, parametrów zapytania lub zmiennych, które dzielą pamięć podręczną. Testuję warianty ze stanem zalogowania i bez niego. W ten sposób mogę szybko znaleźć poprawki zapewniające stabilną prędkość.

Typowe błędy i poprawki

Zbyt wiele Warianty w pamięci podręcznej są częstym hamulcem. Ograniczam parametry zapytań w kluczu i neutralizuję parametry śledzenia. Kolejnym klasykiem są sprzeczne nagłówki, takie jak no-store wraz z długim max-age. Puste lub nieprawidłowe czyszczenie może również sprawiać wrażenie, że pamięć podręczna nie działa. Szybko rozwiązuję takie problemy za pomocą jasnych reguł i logów.

Inną kwestią są wtyczki, które zapisują dynamiczną zawartość zakodowaną na stałe w kodzie HTML. Przenoszę takie elementy do fragmentarycznych punktów końcowych, które buforują lub ładują się niezależnie. Pliki cookie często blokują pamięć podręczną krawędzi w sposób niezamierzony; usuwam niepotrzebne pliki cookie na wczesnym etapie. Słabe wersjonowanie zmusza przeglądarki do wielokrotnego przeładowywania; konsekwentnie numeruję pliki. Dzięki temu potok jest czysty i odporny.

Drzewo decyzyjne: Kto odpowiada na zapytanie?

Definiuję jasną ścieżkę decyzyjną, aby określić, który poziom jest dozwolony do dostarczenia. Pozwala to uniknąć niepotrzebnych uderzeń w źródło i w powtarzalny sposób zmniejsza TTFB.

  • 1) Czy zasób jest niezmienny (plik w wersji)? Pamięć podręczna przeglądarki z długim maksymalnym czasem życia i niezmienna.
  • 2) Czy żądanie jest anonimowe, GET i bez wrażliwych plików cookie? Edge/page cache z public, s-maxage i stale-while-revalidate.
  • 3) Czy żądanie zawiera Auth-Cookies, Authorisation-Header lub jest POST? Origin, opcjonalnie z Object-Cache.
  • 4) Czy adres URL zawiera tylko parametry kosmetyczne (utm, fbclid)? Usuwam je z klucza pamięci podręcznej.
  • 5) Czy potrzebujesz małych części na żywo (np. liczba koszyków)? Fragmentacja przez AJAX lub ESI.
// pseudo logika
if (immutable_asset) return browser_cache;
if (is_get && is_anonymous && cacheable) return edge_or_page_cache;
if (needs_fragment) return cached_html + dynamic_fragment;
return origin_with_object_cache;

Opanowanie fragmentacji: ESI, AJAX i częściowe renderowanie

Izoluję dynamiczne wyspy, aby reszta mogła się mocno buforować. ESI nadaje się do wstrzykiwania po stronie serwera (np. spersonalizowane bloki), AJAX do punktów przeładowania po stronie klienta. Ważne jest, aby fragmenty otrzymywały własne, krótkie TTL, aby pozostały aktualne bez unieważniania całego dokumentu.

  • Podstawowy framework statyczny: długi TTL, publiczny, s-maxage, stale-while-revalidate.
  • Dynamiczny fragment: krótki TTL, must-revalidate lub no-store, jeśli spersonalizowany.
  • Przypadek błędu: stale-if-error na wrapperze HTML zapobiega białym stronom.
// Przykładowy nagłówek dla koperty HTML
Cache-Control: public, max-age=0, s-maxage=600, stale-while-revalidate=60, stale-if-error=86400

// Przykładowy nagłówek dla fragmentu prywatnego
Cache-Control: private, no-store

Unikaj stłoczenia pamięci podręcznej i kontroluj rozgrzewkę

Zapobiegam efektowi stada, w którym wiele jednoczesnych chybień zalewa Origin. Miękki TTL/twardy TTL, koalescencja żądań i blokowanie to moje narzędzia. Używam preloaderów, które cyklicznie rozgrzewają mapy witryn lub ważne ścieżki i rozkładam TTL, aby nie wszystko wygasało w tym samym czasie.

  • Miękki TTL: worker może odnawiać wygasłe obiekty, podczas gdy inni konsumenci wciąż otrzymują nieaktualne.
  • Coalescing: Jednoczesne żądania dotyczące tego samego klucza są łączone.
  • Rozłożone w czasie czasy TTL: Krytyczne strony otrzymują rozłożone w czasie czasy uruchamiania, aby wygładzić fale oczyszczania.
// Przykład stopniowanych czasów wykonywania
/home, /category/* -> s-maxage=900
/article/* -> s-maxage=1800
/search -> s-maxage=120, stale-while-revalidate=30

Czyste wyrównanie konstrukcji TTL w łańcuchu

Dostrajam TTL przeglądarki, krawędzi i pochodzenia, aby ponowna walidacja miała miejsce tam, gdzie jest to najbardziej korzystne. W przypadku HTML polegam na s-maxage na krawędzi i utrzymuję max-age na niskim poziomie w przeglądarce, aby zagwarantować szybkie czyszczenie. W przypadku zasobów odwracam to: bardzo długie TTL przeglądarki, ponieważ wersjonowanie zapewnia aktualność.

// HTML
Cache-Control: public, max-age=0, s-maxage=600, stale-while-revalidate=60

// Zasoby w wersji
Cache-Control: public, max-age=31536000, immutable

Unikam sprzecznych specyfikacji, takich jak no-cache wraz z immutable. Jasne reguły tworzą spójne wyniki w całej hierarchii.

Kompresja, HTTP/2/3 i priorytetyzacja

Aktywuję Gzip/Brotli i poprawnie ustawiam nagłówek Vary, aby warianty były czysto oddzielone. Dzięki HTTP/2/3 korzystam z multipleksowania i priorytetyzacji; zmniejsza to blokowanie nagłówka linii, gdy wiele zasobów jest ładowanych równolegle.

Przykład # NGINX
gzip włączony;
gzip_types text/css application/javascript application/json image/svg+xml;
brotli on;
brotli_types text/css application/javascript application/json image/svg+xml;
add_header Vary "Accept-Encoding" zawsze;

# Długi TTL przeglądarki dla zasobów
location ~* .(css|js|svg|woff2|jpg|png)$ {
  expires 1y;
  add_header Cache-Control "public, max-age=31536000, immutable";
}

Uwierzytelnianie, pliki cookie i bezpieczeństwo

Nigdy nie cache'uję publicznie osobistych treści. Oznaczam żądania z nagłówkami autoryzacji lub sesyjnymi plikami cookie jako prywatne lub specjalnie omijam pamięć podręczną krawędzi. Jednocześnie umieszczam na białej liście tylko niezbędne pliki cookie, aby klucz pamięci podręcznej pozostał niezauważony.

  • Obszary logowania/konta: Kontrola pamięci podręcznej: prywatna lub bez przechowywania.
  • Publiczne strony HTML: publiczne, s-maxage; unikaj ustawiania plików cookie.
  • Higiena plików cookie: Usuń nieistotne pliki cookie (np. śledzące) z klucza.
// Logika podobna do VCL
if (req.http.Authorisation) { return(pass); }
if (req.http.Cookie ~ "session=") { return(pass); }
// Tylko niezbędne pliki cookie w kluczu
unset req.http.Cookie: ".*";

Efektywne buforowanie API i punktów końcowych wyszukiwania

Dokonuję ścisłego rozróżnienia między metodami: GET może być buforowany, POST zwykle nie. W przypadku częstych zapytań ustawiam krótkie wartości s-maxage plus stale-while-revalidate, aby wygładzić czasy odpowiedzi. Odpowiedzi z błędami 4xx/5xx buforuję tylko krótko lub wcale, aby poprawki zaczęły obowiązywać natychmiast.

// Przykładowy nagłówek dla publicznego API GET
Cache-Control: public, max-age=0, s-maxage=120, stale-while-revalidate=30

// Oszczędne buforowanie błędów
Cache-Control: public, s-maxage=10

Obserwowalność: nagłówki, logi i kontrola TTFB

Używam inspekcji nagłówków i dzienników, aby łańcuch był przejrzysty. Wiek, wskaźniki trafień/braków i status upstream pokazują mi, gdzie tracony jest czas. Używam prostych narzędzi do powtarzalnego sprawdzania TTFB i znajdowania wartości odstających.

Zmierz # TTFB
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}sn" https://example.org

Sprawdź nagłówek #
curl -I https://example.org | sed -n '1,20p'
Dziennik # NGINX ze statusem pamięci podręcznej
log_format timed '$remote_addr "$request" $status $body_bytes_sent '
                 '$upstream_cache_status $upstream_response_time $request_time';
access_log /var/log/nginx/access.log timed;

Porównuję dane dziennika z wdrożeniami i czyszczeniami. Wysokie wartości szczytowe chybień bezpośrednio po wdrożeniach wskazują na brak rozgrzewki lub zbyt krótkie wartości TTL. Jeśli Age pozostaje stale niski, sprawdzam, czy pliki cookie nie omijają pamięci podręcznej krawędzi.

Wdrażanie: wersjonowanie i usuwanie na bieżąco

Tworzę wersje w nazwach plików (np. app.9f3c1.js), aby umożliwić agresywne buforowanie przeglądarki. W przypadku HTML używam ciągłego czyszczenia, które najpierw aktualizuje krytyczne strony, a następnie głębokość i długie runnery. Wdrożenia niebieskie/zielone oddzielają kompilację od wydania i dają mi czas na specjalne rozgrzanie pamięci podręcznych.

// Potok zasobów
style.[hash].css
app.[hash].js
// HTML zawsze odnosi się do nowych hashy

Planuję okna oczyszczania poza godzinami szczytu i monitoruję wskaźnik trafień natychmiast po ich zakończeniu. W ten sposób unikam szczytów obciążenia Origin.

Warianty obrazów, DPR i responsywne buforowanie

Generuję warianty obrazu (rozmiar, format) w sposób deterministyczny, aby klucz pamięci podręcznej pozostał stabilny. W przypadku wariantów WebP/AVIF oddzielam je wyraźnie za pomocą ścieżki pliku lub parametrów zamiast tylko za pomocą nagłówków Accept, aby uniknąć eksplozji Vary. W przypadku wyświetlaczy o wysokiej rozdzielczości (DPR) używam srcset/sizes, co pozwala przeglądarce wybrać najlepszy wariant, a pamięć podręczna zaczyna działać dla każdego konkretnego zasobu.

<img src="img/hero-1024.jpg"
     srcset="img/hero-768.jpg 768w, img/hero-1024.jpg 1024w, img/hero-1600.jpg 1600w"
     sizes="(max-width: 768px) 90vw, 1024px" alt="">

Utrzymuję małą liczbę wariantów na motyw i usuwam nieaktualne rozmiary z potoku, aby pamięć podręczna nie ulegała fragmentacji.

Planowanie pojemności: pamięć podręczna i rozmiary obiektów

Rozmiar pamięci podręcznej zależy od rzeczywistych wzorców dostępu: kilka dużych obiektów (obrazy, filmy) wymaga innych strategii niż wiele małych (HTML, JSON). Ustawiam limity maksymalnego rozmiaru obiektu i sprawdzam, czy popularne obiekty pozostają w pamięci. Wysoki wskaźnik ponownego użycia jest ważniejszy niż bezwzględny rozmiar; dlatego przycinam klucze, łączę warianty i zapobiegam duplikatom.

// Przykład: Limity
max_object_size = 10m
default_ttl = 600
nuke_limit = umiarkowany (eksmisje bez przeciągnięć)

Praktyczna lista kontrolna do wdrożenia

Aktywuję OPcache z wystarczającą ilością pamięci i sprawdzić współczynnik trafień. Następnie konfiguruję buforowanie stron, wykluczam krytyczne ścieżki i wstępnie ładuję ważne adresy URL. Następnie ustawiam nagłówki przeglądarki z długimi czasami dla niezmiennych plików i wersjonowania. W CDN definiuję klucze pamięci podręcznej, TTL i strategie czyszczenia oraz aktywuję stale-while-revalidate. Na koniec używam narzędzi pomiarowych, aby sprawdzić, czy TTFB, LCP i współczynnik trafień krawędzi osiągają cele.

Krótkie podsumowanie

Używam Buforowanie hierarchiczny: OPcache przyspiesza kod, pamięć podręczna strony dostarcza HTML, nagłówki przeglądarki utrzymują zasoby lokalnie, a Edge zbliża zawartość do użytkowników. Dzięki jasnym kluczom, odpowiednim TTL i sprytnemu unieważnianiu, zmniejszam obciążenie serwera, przepustowość i opóźnienia. Zmierzone wartości zapewniają postęp i pokazują potencjał optymalizacji. Tworzy to niezawodny łańcuch od źródła do urządzenia końcowego. Każdy, kto szuka dodatkowych szczegółów na temat globalnego dostarczania, znajdzie wystarczająco dużo punktów wyjścia w praktyce, aby uczynić własną architekturę zauważalnie szybszą.

Artykuły bieżące