Jak zmniejszyć liczbę zapytań HTTP przez łączenie i cache’owanie skryptów JavaScript oraz plików CSS
W czasach, gdy skrypty JavaScript i arkusze CSS są umieszczane w wielu zewnętrznych plikach, a łącznie nierzadko zajmują ponad 300 kilobajtów, warto skorzystać z prostego skryptu, aby zmniejszyć znacznie liczbę zapytań HTTP i tym samym odciążyć serwer.
Spis treści:ZałożeniaWczytanie i połączenie plików Kompresja Cache Wynik końcowy Testy szybkości |
Skrypt wczyta wszystkie podane pliki z kodem, połączy w jeden, a następnie zwróci do strony głównej. Dodatkowo, usunięte zostaną wszystkie białe znaki. Spowoduje to, że zamiast kilkudziesięciu, pozostaną tylko dwa zapytania HTTP (dla CSS i JS) i około 15% mniej przesyłanych danych.
Dzięki temu zaoszczędzimy całkiem dużo czasu podczas ładowania strony, a po zastosowaniu cache’owania skrypt stanie się praktycznie „niezauważalny” dla serwera.
Założenia
Aby oddzielić poszczególne typy plików od siebie, należy założyć dwa foldery.
- /css na arkusze stylów,
- /scripts na pliki JavaScript.
Dodatkowo, wewnątrz scripts umieścimy folder tmp na pliki cache. Aby adres wyglądał elegancko, a także by już na samym początku odfiltrować zapytania, które mogą próbować wczytać niepożądane pliki, napiszemy prostą regułę mod_rewrite, dzięki czemu skrypt będzie dostępny pod adresem merge/typ/plik1;plik2;plik_n.
Podstawową zawartość pliku .htaccess będą stanowił tylko dwie linie kodu.
| RewriteEngine on RewriteRule ^merge/(js|css)+/([a-zA-Z0-9;\.]+)$ merge.php?typ=$1&files=$2 [L] |
Oczywiście, jeśli taki plik już istnieje na serwerze, należy uważać, aby go nie nadpisać – niektóre klienty FTP nie wyświetlają stosownego ostrzeżenia o jego obecności. W takim wypadku należy do istniejącego już pliku dodać tylko drugą linię kodu.
Wczytanie i połączenie plików
W tym momencie jesteśmy gotowi do uruchomienia szkieletu skryptu, który oferuje już podstawową funkcjonalność, czyli łączenie plików.
Zaczynamy od sprawdzenia po raz kolejny czy poprzez $_GET do skryptu nie wkradną się niechciane dane. Eliminujemy więc inne typy niż .js i .css, a następnie usuwamy z listy plików znaki inne niż litery, cyfry i średnik. Kolejne linie to generowanie adresu do pliku tymczasowego (nie jest na razie wykorzystywane) oraz „rozbicie” ciągu plików oddzielonych średnikami, na tablicę z ich nazwami.
Następnie, w zależności od ustalonego typu plików, wysyłany jest odpowiedni nagłówek, a także ustalane są pewne zmienne, oznaczające ścieżkę dostępu oraz rozszerzenie.
Po tej czynności skrypt w pętli foreach sprawdza, czy dany plik istnieje, a jeśli tak – wczytuje go do zmiennej $output, dorzucając w komentarzu jego nazwę. Na koniec cała zmienna $output jest zwracana do treści pliku, z adnotacją o wielkości całego gotowego kodu.
| <?php if ($_GET['typ']!="js" && $_GET['typ']!="css") { die("Błąd"); } $files = preg_replace("/[^0-9a-zA-Z;\.]/", "", $_GET['files']); $cacheFile = "scripts/tmp/".md5($_GET['typ'] .$files).".tmp"; $files = explode(";", $files); if ($_GET['typ']=="js") { Header ("Content-type: text/javascript"); $path="./scripts/"; $ext = ".js"; }else if ($_GET['typ']=="css") { Header ("Content-type: text/css"); $path="./css/"; $ext = ".css"; } foreach ($files as $file) { if (file_exists($path.$file.$ext)) { $output.= "/*plik ".$file.$ext."*/\n"; $output.= file_get_contents($path.$file.$ext)."\n\n"; } } echo $output; echo strlen($output)." bytes"; ?> |
W efekcie – po wrzuceniu pliku ze skryptem, pliku .htaccess oraz kilku przygotowanych plików .css do odpowiedniego folderu na serwerze i odpaleniu skryptu poprzez adres: http://twojserwer.pl/merge/css/plik1;plik2;plik3 (koniecznie bez rozszerzeń) – na ekranie powinniśmy uzyskać efekt podobny do poniższego – oczywiście treść strony będzie zależała od przygotowanych przez Ciebie arkuszów CSS.

«poprzednia 1 2 3 następna »
Komentarze
Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka
(słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.
Popularne
Nazwa padła ofiarą szantażystów, inni polscy hosterzy też zagrożeni?
22
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Premiera Diablo 3 wzbudziła dyskusję na temat gier, które zawsze chcą być online
19
Nowy problem z Windows 8: bootuje się za szybko
10
Amerykańscy rodzice straszeni „e-narkotykami” dostępnymi w Sieci
21
Anonymous upubliczniają 1,7 GB danych wykradzionych Departamentowi Sprawiedliwości USA
12
Blueseed: libertariańska sztuczna wyspa przyciągnęła już ponad sto startupów z całego świata
8
Rewolucja w Firefoksie, nowa łatka czterokrotnie ograniczyła zużycie pamięci
20
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
CVDazzle: makijaż jest w stanie pokonać automatyczne systemy ulicznego monitoringu
3
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Ubuntu 12.04 LTS już dostępny: stabilna dystrybucja na następne pięć lat?
28
Zostań webmasterem polskiego rządu, zarobisz na komfortowe życie dla siebie i swojej rodziny
33
Społeczność
piotrek____ @asdfgh - yup, też tak sądzę.
Tak jak wtedy ten przeciek o żołnierzu...
gonzales Javowcy pozdrawiają dotnetowców xD
kaziks Galaxy S II - u mnie po aktualizacji Firefox działa strasznie zacina się...
Doniek Szkoda że strona z demo nie działa - non stop się przeładowuje
bartez Niech zaczną jeszcze bardziej ograniczać programistów, to zdziwią się ilu...
Dave Smith Jestem Pastor Dave Smith prywatny pożyczkodawca pieniądze, z czego ponad...
marcusm Fajna reklama produktu za 500 zł
- Najdmen.pl: Konta www z wyłączonym licznikiem transferu od IONIC.pl (1)
- 2BE.PL: [Oferta] Promocja jak złoto w 2BE.PL (1)
- gardius: Dobra hurtownia sportowa (1)
- gardius: Tanie książki gdzie warto kupować? (1)
- Najdmen.pl: PROMOCJA, 500 DOMEN .EU ZA 1 PLN NETTO ! (1)
- VMLine: [Oferta] Serwery VPS Xen-HVM/OpenVZ z darmową administracją (2)
- Marek: Generowanie PDFa (2)
Polecane książki
Praca
Czytaj Webhosting
Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.
Zarejestruj domenę
Sprawdź dostępność swojej domeny:
| .pl: | 0 zł | .com: | 19.90 zł | |
|---|---|---|---|---|
| .com.pl: | 0 zł | .eu: | 19.90 zł |









#1 Jan Koprowski® 2009-09-21 07:45:17 0
IP: 192.198.151.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.21 Safari/532.0
#2 AdamB 2009-09-21 08:50:00 0
IP: 89.79.248.[...] Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090803 Ubuntu/9.04 (jaunty) Shiretoko/3.5.2
#3 partyy 2009-09-21 11:42:30 0
IP: 79.162.217.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 GTB5 (.NET CLR 3.5.30729) Creative ZENcast v1.01.06
#4 koderka 2009-09-29 19:30:37 0
IP: 87.206.112.[...] Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00
#5 koderka 2009-09-29 19:32:09 0
IP: 87.206.112.[...] Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.00
#6 vojski® 2010-01-28 01:13:21 0
IP: 150.254.240.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
#7 lolek 2010-02-09 09:34:37 0
IP: 81.15.208.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7