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 »
Polecamy
Reklama
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
Firefox 10 już jest. Wiele atrakcji dla programistów, użytkownicy raczej nic nie zauważą
9
Źle się dzieje z Chrome, ze stabilnością coraz gorzej. Gdzie się podziała słynna izolacja procesów?
26
MSWiA zamówiło narzędzia do „złamania” Tora i podsłuchiwania internautów. Czy złamało przy tym prawo?
89
Pobieraczek.pl pozwie internautów, którzy nie chcą płacić abonamentu
1455
Debata w sprawie ACTA: internauci spodziewali się chyba czegoś innego
13
Nowa polityka prywatności Google'a już za miesiąc wejdzie w życie. Mamy się czego bać?
16
PHP 5.3.9 nie pozwoli hakerom zawiesić serwera. Pozwoli za to przejąć nad nim kontrolę
28
MSWiA zamówiło narzędzia do „złamania” Tora i podsłuchiwania internautów. Czy złamało przy tym prawo?
89
[Aktualizacja] Facebook zablokował Demotywatory.pl. W czym zawiniły?
36
FBI zamknęło Megaupload. Anonimowi dali się sprowokować. Teraz ich akcja uzasadni potrzebę SOPA?
17
Pobieraczek.pl pozwie internautów, którzy nie chcą płacić abonamentu
1455
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
15
Rząd Tuska zablokował dostęp do tańszych leków z internetowych aptek
61
„Donald matole, twój rząd dopadną kibole” – hakerska elita przyłącza się do walki z ACTA
23
Społeczność
WebDev Z tego wynika, że zmienią się tylko serwery z którymi przeglądarka łączy...
agilob Ale folder bez nazwy się da założyć :P
zetesha Apple nie zrezygnował z PPC całkiem ponieważ posiada P.A. Semi, która to...
pablo1919191 Thunderbolt to jest technolgia intela wiec skora appel wpakowal jako...
BartekBb Już wiem skąd kopiujecie artykuły, bo zrobiliście ten sam błąd co na...
Marr moglibyście się zdecydować. W newsach podajecie, że systemy wymiany (czyli...
setXYZ I jeszcze warto poczytać co o tym myśli sam MS http://webhosting.pl/Koniec...
- 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)
- Marek: problem z menu (2)
- Marek: Własne checkboxy w HTML,CSS (1)
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