Łatwym i sensownym krokiem w celu przyśpieszenia wyświetlania naszej strony, przeniesienie części statycznych (css, js, obrazy) na serwery, które są podłączone do mocnego łącza, lecz niekoniecznie muszą posiadać wielką moc obliczeniową.Będą one służyły tylko do hostowania plików.
Takie serwery nazywają się CDN (Content delivery network). Idea Content Delivery Network polega na umieszczeniu w głównych węzłach sieci różnych operatorów internetowych, serwerów przyśpieszających ściąganie tych obiektów ze stron WWW które są największe - najczęściej są to pliki multimedialne i dystrybucje oprogramowania - i których ściągnięcie z serwera zajmuje zwykle najwięcej czasu. Ponieważ jednak serwery CDN znajdują się zwykle blisko odbiorcy dlatego czas potrzebny na ściągnięcie treści z serwerów CDN jest dużo krótszy niż z oryginalnego serwera. W bardzo łatwy i tanim kosztem można utworzyć własny, alternatywny serwer, umieszczając je na darmowych hostingach (tam, gdzie aktywne połączenia zewnętrzne) oraz promocyjnych.
Schemat wygląda tak:
1. Użytkownik pobiera treść naszej strony z głównego serwera.
2. Otrzymuje on kod html, z podlinkowanym arkuszem CSS (style.css).
3. Przeglądarka użytkownika pobiera z zewnętrznego serwera plik (z naszego miniCDN serwera).
4. Serwer sprawdza czy posiada taki plik w cache, i czy już nie wygasł.
5. Jeśli nie ma go w cache lub wygasł, pobiera go z głównego serwera.
6. Pobrany plik, zapisuje w cache.
7 (8). Wysyła plik użytkownikowi

#### Więc do dzieła....

Pierwszym etapem jest stworzenie sub-domeny. Nie jest to konieczne, ale profesjonalniej to wygląda, po za tym lepiej wpłynie na PageRank naszej strony. Ja stworzyłem:i
static.example.com
Należy ją podpiąć na nasz serwer plików miniCDN. Następnie zainstaluj na serwerze poniższy skrypt (w komentarzach kodu więcej info):

### Wersja dla file_get_contents

`(time() + $Expired)) // sprawdzanie, czy plik juz nie wygasl $DownLoad = true; // jesli tak, to pobieramy plik } if($DownLoad){ // sprawdzamy czy mamy pobierac plik czy nie $opts = array( // naglowki , ktore otrzyma glowny serwer 'http'=>array( 'user_agent' => $_SERVER['HTTP_USER_AGENT'], // ukrywamy sie pod nazwa przegladarki uzytkownika 'header'=>"Accept-language: ".$_SERVER['HTTP_ACCEPT_LANGUAGE']."\r\n" // jaki jezy uzytkownik akceptuje ) ); $context = stream_context_create($opts); // ustawienie naglowkow $URLToDownload = $URL.$FileLoc; // link do pliku na serwerze glownym $Result = file_get_contents($URLToDownload, false, $context); // pobieranie pliku $HeadersSet = $http_response_header; // otrzymane naglowki z transakcji $Time = time(); // aktualny czas file_put_contents('tmp/'.$FileMD5.'.tmp', serialize(array("Headers"=>$HeadersSet, "Content"=>$Result, "Time"=> $Time ))); //zapisanie pliku w cache } if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $_SERVER['HTTP_IF_MODIFIED_SINCE'] == gmdate('D, d M Y H:i:s',time()).' GMT') { // sprawdzenie wersju uzytkownika header("HTTP/1.0 304 Not Modified");//Wysylanie naglowka, ze nic nie zmodyfikowano exit; //Zakonczenie skryptu } foreach($HeadersSet as $header) // petla z naglowkami header($header.';'); // wysylanie otrzymanych naglowkow header("Pragma: public"); //naglowki, kotrolujace cache header("Last-Modified: ".gmdate("D, d M Y H:i:s", $Time )." GMT"); // data modyfikacji header('ETag: "'.$FileMD5.'"'); // ETag header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$Expired) . ' GMT'); // kiedy plik wygasnie header ('Vary: Accept-Encoding'); header("Cache-Control: private, max-age=10800, pre-check=10800"); // koedy wygasnie header('XVwebMSG: Sended'); // Dodatkowy naglowek informacyjny echo $Result; // wyswietlenie pliku ?>`

### Wersja dla CURL

`(time() + $Expired)) // sprawdzanie, czy plik juz nie wygasl $DownLoad = true; // jesli tak, to pobieramy plik } if($DownLoad){ // sprawdzamy czy mamy pobierac plik czy nie $URLToDownload = $URL.$FileLoc; // link do pliku na serwerze glownym $Result = file_get_contents_viacurl($URLToDownload); // pobieranie pliku $HeadersSet = $http_response_header; // otrzymane naglowki z transakcji $Time = time(); // aktualny czas file_put_contents('tmp/'.$FileMD5.'.tmp', serialize(array("Headers"=>$HeadersSet, "Content"=>$Result, "Time"=> $Time ))); //zapisanie pliku w cache } if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $_SERVER['HTTP_IF_MODIFIED_SINCE'] == gmdate('D, d M Y H:i:s',time()).' GMT') { // sprawdzenie wersju uzytkownika header("HTTP/1.0 304 Not Modified");//Wysylanie naglowka, ze nic nie zmodyfikowano exit; //Zakonczenie skryptu } foreach($HeadersSet as $header){ // petla z naglowkami if(trim($header)) header($header.';'); // wysylanie otrzymanych naglowkow } header("Pragma: public"); //naglowki, kotrolujace cache header("Last-Modified: ".gmdate("D, d M Y H:i:s", $Time )." GMT"); // data modyfikacji header('ETag: "'.$FileMD5.'"'); // ETag header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$Expired) . ' GMT'); // kiedy plik wygasnie header ('Vary: Accept-Encoding'); header("Cache-Control: private, max-age=10800, pre-check=10800"); // koedy wygasnie header('XVwebMSG: Sended'); // Dodatkowy naglowek informacyjny echo $Result; // wyswietlenie pliku ?>` Następny niepotrzebnym, lecz estetycznym zadaniem jest wygląd linków. Warto zamienić je z :
http://static.example.com/cdn.php/theme/css/style.css
na:
http://static.example.com/theme/css/style.css
Można to wykonać za pomocą modułu mod_rewrite i reguły w pliku .htaccess na serwerach apache: `RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-s [NC] RewriteCond %{REQUEST_FILENAME} !-d [NC] RewriteRule ^(.+) cdn.php/$1 [L,QSA]` Natomiast dla ngnix, stworzenie reguły w pliku konfiguracyjnym. Ostatnim zadaniem jest zmiana na naszej stronie adres plików na naszym serwerze. Teraz nasz serwer będzie miał tylko jedno zadanie - generowanie kodu html naszej strony.
Warty uwagi jest serwer http://www.coralcdn.org/. Jest on darmowy, z bardzo szybkim łączem. Jedynym minusem jest częste awarie. /Licencja/BY-NC/