Zacząłem zbierać materiały do pracy magisterskiej pod tymczasowym tytułem „Inteligentny agent jako sposób optymalizacji współczynnika wykorzystania łącza”.
Przy okazji zahaczyłem trochę praktyki: ‘standardowa’ kompresja danych.
Można do tego celu wykorzystać kilka metod:
Zacząłem zbierać materiały do pracy magisterskiej pod tymczasowym tytułem „Inteligentny agent jako sposób optymalizacji współczynnika wykorzystania łącza”.
Przy okazji zahaczyłem trochę praktyki: ‘standardowa’ kompresja danych.
Można do tego celu wykorzystać kilka metod:
1. Dynamicznie kompresować dane przy użyciu modułu apache mod_deflate lub mod_gzip – wystarczy odhashować LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so dla apache2 lub załadować odpowiedni moduł jeśli korzystamy z Apache v. 1.x w pliku konfiguracyjnym apache (najczęściej httpd.conf), po tym należy zrestartować serwer apache (/etc/init.d/apache2 restart)
Oczywiście, nic nie jest takie proste jak się wydaje, samo załadowanie modułu do Apache nie wystarcza.
Należy także dodać odpowiednią dyrektywę w wpliku .htaccess (jeśli nie mamy dostępu do httpd.conf a moduł jest raportowany np. przez phpinfo()), lub w wspomnianym wyżej httpd.conf
AddOutputFilterByType text/html text/xml application/xml text/javascript text/css
Oczywiście, należy zmienić typy mime podane w powyższym przykładzie na odpowiadające nam (raczej nie zaleca się kompresji obrazów, pdf‘ów i inny binarnych plików które są w postaci skompresowanej.
Dobrze by było zachować jakąś informację o stopniu kompresji, do tego celu można dopisać następujące polecenia do pliku konfiguracyjnego apache/vhosta/modułu (proszę sobie wybrać odpowiednie, lub samemu stworzyć format logu)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" (%{ratio}n)" combineddeflate
CustomLog /var/log/apache2/access_log combineddeflate
Trochę bardziej skomplikowany sposób logowania
DeflateFilterNote Input input_info
DeflateFilterNote Output output_info
DeflateFilterNote Ratio ratio_info LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
CustomLog /var/log/apache2/deflate_log deflate
Oczywiście, pasowało by też sprawdzać czy klient (przeglądarka) obsługuje poprawnie skompresowane pliki i w zależności od User-Agent wybierać odpowiednią metodę kompresji/lub zrezygnować z kompresji (niektóre przeglądarki, np. starsze wersje Mozilli wysyłały nagłówek Accept-Encoding: gzip,deflate, lecz nie potrafiły zdekompresować otrzymanych danych).
2. Dynamicznie kompresować za pomocą odpowiedniej funkcji w php – należy dodać do naszego pliku php na początku, przed wysłaniem jakichkolwiek danych do klienta
ob_start("gzhandler")
Nie przejmujemy się nagłówkami, zostaną dołączone automagicznie, jeśli tylko przeglądarka zadeklaruje możliwość dekompresji za pomocą Accept-Encoding: gzip,deflate
3. Jeżeli mamy dużo statycznych plików css, javascript to możemy je skompresować standardowym gzip’em, w linkach umieścić odpowiednie odwołania do skompresowanych plików, wymusić za pomocą np. .htaccess odpowiednie nagłówki:
AddType "text/javascript" .jgz
Header set Content-Encoding: gzip
Header set Transfer-Encoding: gzip
lub
AddType "text/javascript" .jgz
Header set Transfer-Encoding: gzip
Narażamy się tym samym na stratę użytkowników korzystających z starszych przeglądarek, które nie obsługują kompresji, skompresowane w ten sposób pliki nie zostaną otworzone.
Ps. Jeżeli korzystacie z Outpost Firewall, to należy włączyć obsługę gzip, ponieważ standardowa konfiguracja wycina nagłówek Accept-Encoding
W tym celu trzeba zmienić wartość klucza rejestru HKEY_LOCAL_MACHINE\SOFTWARE\Agnitum\Outpost Firewall\EnableGzipEncoding na 1.