This repository has been archived by the owner on Apr 26, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 14
/
exampletext.html
177 lines (150 loc) · 9.92 KB
/
exampletext.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
Ł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. <br/>Takie serwery nazywają się <b>CDN (Content delivery network)</b>. 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.<br/>
Schemat wygląda tak:<br/>
<div style="text-align:center; margin-top:10px;"> <img src="http://www.bordeux.net/File/39/miniCDN.png" alt="miniCDN Server" style="width:300px;"/> </div>
1. Użytkownik pobiera treść naszej strony z głównego serwera.<br/>
2. Otrzymuje on kod html, z podlinkowanym arkuszem CSS (style.css).<br/>
3. Przeglądarka użytkownika pobiera z zewnętrznego serwera plik (z naszego miniCDN serwera).<br/>
4. Serwer sprawdza czy posiada taki plik w cache, i czy już nie wygasł.<br/>
5. Jeśli nie ma go w cache lub wygasł, pobiera go z głównego serwera.<br/>
6. Pobrany plik, zapisuje w cache.<br/>
7 (8). Wysyła plik użytkownikowi<br/>
<br/>
<h4>Więc do dzieła....</h4>
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<br/>
<div style="text-align:center; margin:5px; font-style:italic;"> static.example.com </div>
Należy ją podpiąć na nasz serwer plików miniCDN. Następnie zainstaluj na serwerze poniższy skrypt (w komentarzach kodu więcej info):
<h3>Wersja dla file_get_contents</h3>
<code lang="php">
<?php
/***************************
********* miniCDN **********
*** Krzysztof Bednarczyk ***
**** http://bordeux.net ****
****************************/
$URL = "http://www.bordeux.net/"; //Adres naszej strony
$Expired = 300; // Czas w sekundach, jak długo mają być przechowywane w cache pliki
if(!isset($_SERVER['PATH_INFO']) || $_SERVER['PATH_INFO'] == '/') // Sprawdzanie, czy jest wskazany plik do pobrania
exit("miniCDN Server");
$FileLoc = substr($_SERVER['PATH_INFO'],1); //pobieranie lokalizacji pliku na serwerze, np theme/css/style.css
$FileMD5 = md5($FileLoc); // dajemy unikalny ID plikowi
$DownLoad = true; //Domysla wartosc - true oznacza, ze plik bedzie sciagniety z serwera glownego
if(file_exists('tmp/'.$FileMD5.'.tmp')){ // sprawdzanie czy dany plik mamy cache
$TMPFile = unserialize(file_get_contents('tmp/'.$FileMD5.'.tmp')); // jesli tak, otwieramy go
$Result = $TMPFile["Content"]; // pobieramy jego zawartosc
$HeadersSet = $TMPFile["Headers"]; // otrzymane naglowki
$Time = $TMPFile["Time"]; // czas pliku
$DownLoad = false; // anulowanie pobierania pliku
if( $Time > (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
?>
</code>
<h3>Wersja dla CURL</h3>
<code lang="php">
<?php
/***************************
********* miniCDN **********
*** Krzysztof Bednarczyk ***
**** http://bordeux.net ****
****************************/
$PathInfo = (isset($_SERVER['PATH_INFO']) ? 'PATH_INFO' : 'ORIG_PATH_INFO');
function file_get_contents_viacurl($UrlPage){
$ch = curl_init ($UrlPage) ; //initializacja curl wraz z adresem url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1) ; // ustawienie, by zwrocilo zawartosc strony
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // podszywanie pod przegladarke klienta
curl_setopt($ch, CURLOPT_HEADER, 1); // ustawienie, by zworcilo naglowki
$Result = curl_exec ($ch) ; // wykonanie, oraz otrzymanie strony wraz z naglowkami
$curl_info = curl_getinfo($ch); // informacje o zapytaniu - wielkosc, ile czasu trwalo, ilosc naglowkow
curl_close($ch); // zakoncznie dzialania curl
$header_size = $curl_info['header_size']; // pobieramy ile znakow ma naglowek
$header = substr($Result, 0, $header_size); // pobieramy naglowki
$Result = substr($Result, $header_size); // pobieramy tresc strony bez naglowkow
$GLOBALS['http_response_header'] = explode("\n", $header); // wsadzamy naglowko do tablicy
return $Result; // rezultat
}
$URL = "http://www.bordeux.net/"; //Adres naszej strony
$Expired = 300; // Czas w sekundach, jak długo mają być przechowywane w cache pliki
if(!isset($_SERVER[$PathInfo]) || $_SERVER[$PathInfo] == '/') // Sprawdzanie, czy jest wskazany plik do pobrania
exit("miniCDN Server");
$FileLoc = substr($_SERVER[$PathInfo],1); //pobieranie lokalizacji pliku na serwerze, np theme/css/style.css
$FileMD5 = md5($FileLoc); // dajemy unikalny ID plikowi
$DownLoad = true; //Domysla wartosc - true oznacza, ze plik bedzie sciagniety z serwera glownego
if(file_exists('tmp/'.$FileMD5.'.tmp')){ // sprawdzanie czy dany plik mamy cache
$TMPFile = unserialize(file_get_contents('tmp/'.$FileMD5.'.tmp')); // jesli tak, otwieramy go
$Result = $TMPFile["Content"]; // pobieramy jego zawartosc
$HeadersSet = $TMPFile["Headers"]; // otrzymane naglowki
$Time = $TMPFile["Time"]; // czas pliku
$DownLoad = false; // anulowanie pobierania pliku
if( $Time > (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
?>
</code>
Następny niepotrzebnym, lecz estetycznym zadaniem jest wygląd linków. Warto zamienić je z :
<div style="text-align:center; margin:5px; font-style:italic;"> http://static.example.com/cdn.php/theme/css/style.css </div>
na:
<div style="text-align:center; margin:5px; font-style:italic;"> http://static.example.com/theme/css/style.css </div>
Można to wykonać za pomocą modułu mod_rewrite i reguły w pliku .htaccess na serwerach apache:
<code lang="xml">
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-s [NC]
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteRule ^(.+) cdn.php/$1 [L,QSA]
</IfModule>
</code>
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.<br/><br/>
Warty uwagi jest serwer <a href="http://www.coralcdn.org/">http://www.coralcdn.org/</a>. Jest on darmowy, z bardzo szybkim łączem. Jedynym minusem jest częste awarie.
<include url="http://bednarczyk.bordeux.net/">/Licencja/BY-NC/</include>