Jest już późno, napiszę więc krótko. Najprostszym sposobem na szybsze wczytywanie strony jest kompresja oraz zmuszenie przeglądarki do trzymania strony w pamięci podręcznej. Cały proces jest dosyć prosty i nie powinien stanowić większego problemu. Całość sprowadza się do ustawień w pliku .htaccess pod warunkiem, że odpowiednie moduły są włączone.

Kompresja

Kompresję można zorganizować na trzy sposoby. Pierwszy z nich umieszczenie skompresowanych plików na serwerze, ale takie rozwiązanie będzie dobre dla stron statycznych. Drugą opcją jest włączenie automatycznego kompresowania określonych plików. Rozwiązania dobre, ale obciążające serwer (gdy źle skonfigurowane). Trzecią opcją jest połączenie tych dwóch myśli. Tym tematem zajmę się w przyszłości.

Można sprawdzić swoją stronę pod kątem kompresji tutaj: checkgzipcompression.com

Do tego przykładu muszą być włączone moduły: mod_deflate.c oraz mod_filter.c. Odpowiada on za kompresję.


<IfModule mod_deflate.c>
  <IfModule mod_filter.c>
    # Kompresuj HTML, CSS, JavaScript, Text, XML and fonts
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
    AddOutputFilterByType DEFLATE application/x-font
    AddOutputFilterByType DEFLATE application/x-font-opentype
    AddOutputFilterByType DEFLATE application/x-font-otf
    AddOutputFilterByType DEFLATE application/x-font-truetype
    AddOutputFilterByType DEFLATE application/x-font-ttf
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE font/opentype
    AddOutputFilterByType DEFLATE font/otf
    AddOutputFilterByType DEFLATE font/ttf
    AddOutputFilterByType DEFLATE image/svg+xml
    AddOutputFilterByType DEFLATE image/x-icon
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/map
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/xml
  </IfModule>
  # Zabezpieczenie dla starych przeglądarek
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  Header append Vary User-Agent
</IfModule>

Jak zawsze warto się zabezpieczyć sprawdzając czy moduły są dostępne. Jak łatwo zauważyć jest tutaj podpięta kompletna kompresja dla praktycznie wszystkich typów plików z wyłączeniem obrazów *.jpg i *.png. Jest to związane z z tym, że pliki takie mogą dosyć dużo ważyć a to spowodowałoby duże obciążenie dla serwera.

Pamięć podręczna przeglądarki

Cache jest o tyle przydatny, że nie musimy takiej strony ściągać na swój dysk za każdym razem kiedy na nią wchodzimy. Typowa strona nawet dosyć często aktualizowana składa się z wielu elementów, które są modyfikowane stosunkowo rzadko. Skrypty, grafika czy style są elementami które będą się zmieniać może raz na rok lub nawet rzadziej. Grafiki zazwyczaj dochodzą nowe co spowoduje dodanie ich do cache’a. Dla takich plików zaleca się ustawienie czasu przechowywania na rok. Oczywiście dużo zależy od naszych potrzeb. Dla strony gotowej bezpiecznie można się trzymać tych wytycznych. A gdyby trzeba było coś zmienić na stronie to jak zmusić użytkowników do odświeżenia strony? Wystarczy prosty myk. Pliki trzeba podpisywać. W razie zmian plik uzyska nowy podpis. W najprostszej wersji są to numery wersji plików np styl_1.css -> styl_2.css lub podpis generowany automatycznie np. styl.css?376487243876243. Dla plików html nalezy zastosować odpowiednio krótki czas. Dla typowej strony może to być np. tydzień, dla bloga dzień, a dla strony z informacjami 10 min. Wszystko zależy od tego jak często strona będzie aktualizowana.

Poniższy kod jest przykładem konfiguracji. Do jego użycia jest potrzebny moduł: mod_expires.c

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf|txt|html|x-html|php|css|xml|js|woff|ttf|svg|eot|map)(\.gz)?$">
  <IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 week"
    ExpiresByType image/x-icon "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType application/x-shockwave-flash "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/javascript "access plus 1 year"
    ExpiresByType application/x-javascript "access plus 1 year"
    ExpiresByType text/html "access plus 600 seconds"
    ExpiresByType application/xhtml+xml "access plus 600 seconds"
    Header unset Last-Modified
  </IfModule>
</FilesMatch>

Na początek określamy jakie pliki przeglądarka będzie musiała wrzucić do pamięci podręcznej. Następnie trzeba włączyć funkcję oraz ustawić okresy domyślny i dla poszczególnych plików. Na koniec trzeba wyłączyć nagłówek ostatnich zmian.

Jest to jedno z dostępnych rozwiązań. Z drugim rozwiązaniem maiłem pewne problemy. W zależności od serwera działało częściowo, w całości lub wywalało błędy pomimo zabezpieczenia warunkiem. Jest to też rozwiązanie zalecane przez Google’a. Argumentują to tym, że większa ilość przeglądarek obsługuje „datę ważności” pliku.

Gotowe rozwiązania

Opisane rozwiązanie jest uniwersalne dla każdej strony opartej o dowolny CMS lub goły kod np. PHP. Dla popularnych systemów takich jak Joomla, WordPress czy Drupal na pewno są gotowe rozwiązania, które wystarczy dodać do projektu.

 

Ten wpis nie ma komentarzy. Kto pierwszy ten lepszy!

Dołącz do dyskusji

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *