Przejdź do głównej zawartości

Caching w webie - przegladarka, serwer, nagłówki

Co przekazesz słuchaczom?

Po tej prezentacji słuchacze będą w stanie:

  • Zrozumiec czym jest cache i dlaczego jest ważny
  • Rozrozniac cache przegladarki, serwera i CDN
  • Używać podstawowych nagłówków HTTP do kontroli cache
  • Rozwiazywac typowe problemy z cache (“nie widzę zmian”)
  • Stosowac strategie cache’owania w swoich projektach
  1. Wprowadzenie (2 min)

    • Co to jest cache i po co jest
    • Problem: “dlaczego strona laduje się tak wolno?”
    • Gdzie wystepuje cache w webie
  2. Rodzaje cache (3 min)

    • Cache przegladarki (Browser Cache)
    • Cache serwera (Server-side Cache)
    • CDN (Content Delivery Network)
  3. Nagłówki HTTP (3 min)

    • Cache-Control
    • ETag i Last-Modified
    • Expires (przestarzały)
  4. Problemy i rozwiązania (2 min)

    • “Nie widzę zmian” - cache busting
    • Wersjonowanie plikow
    • Kiedy NIE cache’owac
  5. Podsumowanie (2 min)

    • Strategia cache’owania
    • Pytania i dyskusja

Definicja cache

Cache (wymowa: “kesz”) to mechanizm przechowywania kopii danych w miejscu, z którego można je szybciej pobrać niz z oryginalnego źródła.

Cel: Zmniejszenie czasu ladowania i obciazenia serwera.

Przykład z zycia: Zamiast jechac do biblioteki po książkę za każdym razem, trzymasz ja na polce w domu.

Browser Cache - przechowuje zasoby lokalnie na komputerze użytkownika.

  • Pliki CSS, JavaScript, obrazy
  • Fonty i inne zasoby statyczne
  • Kontrolowane przez nagłówki HTTP
  • Najszybszy dostep (brak requestu)
Pierwszy request:
[Przegladarka] --GET /style.css--> [Serwer]
[Przegladarka] <--200 + plik + Cache-Control-- [Serwer]
Kolejny request (cache hit):
[Przegladarka] --> sprawdza lokalny cache --> plik jest świeży
[Przegladarka] --> używa lokalnej kopii (brak requestu do serwera!)
Kolejny request (cache miss / stałe):
[Przegladarka] --> sprawdza cache --> plik wygasł
[Przegladarka] --GET /style.css + If-None-Match--> [Serwer]
[Przegladarka] <--304 Not Modified-- [Serwer] (użyj lokalnej kopii)

Najważniejszy nagłówek do kontroli cache.

Cache-Control: max-age=3600
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: public, max-age=31536000
DyrektywaZnaczenie
max-age=NPrzechowuj przez N sekund
no-cacheZawsze waliduj z serwerem
no-storeNie przechowuj wcale
publicMoże być cache’owane przez CDN
privateTylko cache przegladarki
CACHE HIT (szybko):
[User] --> [Browser Cache] --> [Strona wyświetlona]
(plik lokalnie) Czas: ~10ms
CACHE MISS (wolno):
[User] --> [Browser Cache] --> [Serwer] --> [Strona wyświetlona]
(brak pliku) (pobierz) Czas: ~500ms
+------------------+
| Przegladarka | <-- Najszybszy (lokalnie)
+------------------+
|
v
+------------------+
| CDN | <-- Szybki (blisko usera)
+------------------+
|
v
+------------------+
| Cache serwera | <-- Sredni (Redis/Memcached)
+------------------+
|
v
+------------------+
| Baza danych | <-- Najwolniejszy
+------------------+
+------------------------+-------------------+
| Typ zasobu | Cache-Control |
+------------------------+-------------------+
| HTML (dynamiczny) | no-cache |
| CSS/JS (z hashem) | max-age=31536000 |
| Obrazy statyczne | max-age=86400 |
| API responses | no-store / private|
| Publiczne dane | public, max-age=N |
+------------------------+-------------------+
<?php
// Dla statycznych zasobow - długi cache
header('Cache-Control: public, max-age=31536000'); // 1 rok
// Dla dynamicznych stron - bez cache
header('Cache-Control: no-cache, no-store, must-revalidate');
// Dla danych API - krótki cache
header('Cache-Control: private, max-age=60'); // 1 minuta
<?php
$content = file_get_contents('data.json');
$etag = md5($content);
// Sprawdz czy klient ma aktualna wersje
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&
$_SERVER['HTTP_IF_NONE_MATCH'] === '"' . $etag . '"') {
header('HTTP/1.1 304 Not Modified');
exit;
}
// Wyslij z ETag
header('ETag: "' . $etag . '"');
header('Cache-Control: no-cache');
echo $content;
<!-- ZLE - plik może być cache'owany zbyt długo -->
<link rel="stylesheet" href="/css/style.css">
<script src="/js/app.js"></script>
<!-- DOBRZE - wersja w nazwie pliku -->
<link rel="stylesheet" href="/css/style.v2.css">
<script src="/js/app.v2.js"></script>
<!-- DOBRZE - hash w query string -->
<link rel="stylesheet" href="/css/style.css?v=abc123">
<script src="/js/app.js?v=abc123"></script>
<!-- NAJLEPIEJ - hash w nazwie (webpack/vite) -->
<link rel="stylesheet" href="/css/style.abc123.css">
<script src="/js/app.abc123.js"></script>
# Cache dla plikow statycznych
<IfModule mod_expires.c>
ExpiresActive On
# Obrazy - 1 miesiac
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
# CSS/JS - 1 rok (z wersjonowaniem!)
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
# HTML - bez cache
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
1. Otworz DevTools (F12)
2. Przejdz do zakładki Network
3. Załaduj strone
4. Sprawdz kolumne "Size":
- "(from disk cache)" = cache hit
- "(from memory cache)" = cache hit (RAM)
- rozmiar w KB = cache miss
5. Sprawdz nagłówki odpowiedzi:
- Response Headers > Cache-Control
- Response Headers > ETag

Wymagania minimalne:

  • Wyjaśnienie czym jest cache i po co jest
  • Pokazanie schematu cache hit/miss
  • Podanie 2 przykładów co cache’owac
  • Omowienie podstawowego problemu “nie widzę zmian”
Ocena: 3.0 (minimum)

Problem: Nie widzę zmian na stronie

Przyczyna: Przegladarka używa starej wersji pliku z cache.

Rozwiązania:

  1. Ctrl+F5 / Cmd+Shift+R - twardy refresh
  2. Wersjonowanie plikow: style.css?v=2 lub style.v2.css
  3. Hash w nazwie: style.abc123.css (automatycznie przez bundler)
  4. Nagłówek no-cache dla plikow HTML

Cache'uj

  • Pliki CSS i JavaScript
  • Obrazy i fonty
  • Biblioteki zewnętrzne
  • Statyczne strony
  • Publiczne dane API

NIE cache'uj

  • Dane użytkownika (prywatne)
  • Wyniki wyszukiwania
  • Formularze i akcje POST
  • Dane w czasie rzeczywistym
  • Strony za logowaniem

Pytanie 1

Dlaczego “wyczysc cache” czesto rozwiązuje problemy?

Pytanie 2

Jak długo cache’owac pliki CSS/JS? Dlaczego warto używać hasha?

Pytanie 3

Kiedy no-cache a kiedy no-store? Jaka jest różnica?

Pytanie 4

Czy cache może powodowac problemy bezpieczeństwa?