Ł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:
(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
?>
(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 :
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.