- Index
De webserver Apache is in staat tekstbestanden automatisch en volledig transparant te comprimeren voor verzending over het internet. Xitami kan dit echter niet, maar daar kunnen wij iets aan doen.
De header bevat ook andere informatie: wanneer het bestand aangemaakt of veranderd werd (zodat de ontvanger kan bepalen of zijn versie in cache bijgewerkt moet worden of niet), hoe groot het bestand is, welk formaat het heeft (HTML, JPEG, enz), maar ook of er compressie toegepast werd.
Dit zijn de headers zoals die met de vorige opdracht opgevraagd werden:
HTTP/1.1 200 OK Date: Sun, 03 Jun 2007 06:29:17 GMT Server: Apache/1.3.33 (Debian GNU/Linux) Last-Modified: Fri, 25 May 2007 07:46:10 GMT ETag: "6ac126-113e-46569442" Accept-Ranges: bytes Content-Length: 4414 Content-Type: text/html X-Cache: MISS from hostingpool012.isp.belgacom.be Connection: closeDe enige headers die echt nodig zijn, zijn de volgende:
Andere headers zijn niet echt nodig. Enkel Connection: close is het vermelden waard. Bij HTTP/1.1 wordt de verbinding tussen server en klant niet afgesloten op het einde van iedere transfer (zodat de volgende elementen sneller verstuurd kunnen worden). Met de instruktie "Connection: close" wordt aangegeven dat de verbinding wel verbroken moet worden op het einde van de transfer. Ik had de connection: close aangevraagd bij de aanvraag van het bestand, en de server heeft mijn aanvraag bevestigd.
Dit is een bestand dat gecomprimeerd verstuurd wordt, de headers zijn nu:
HTTP/1.0 200 OK Content-Length: 721 Content-Type: text/html Content-Encoding: gzip Connection: closeWe geven opnieuw de kode "alles OK", de lengte en het type van bestand dat verwacht wordt, maar ook Content-Encoding: gzip, waarmee we aangeven dat het bestand gecomprimeerd zal verstuurd worden. Als je dan ook de inhoud bekijkt, dan zal je merken dat er van het origineel bestand niet veel meer overblijft.
Dit is de kode om een pagina gecomprimeerd door te sturen:
FUNCTION PBMAIN() .... ' a$ is de naam van het html-bestand dat gecomprimeerd a$ = ... ' en doorgestuurd moet worden. SHELL "d:\gzip -f9 " + a$ OPEN a$ + ".gz" FOR BINARY AS #2 ' We shellen naar GZIP dat de compressie uitvoert GET$ #2, LOF(#2), a$ ' De arguments zijn f (force compression, no prompt) CLOSE ' en 9 (maximale compressie). OPEN ENVIRON$("CGI_STDOUT") FOR OUTPUT AS #1 ' Hier maken we de output aan; we schrijven de PRINT #1, "HTTP/1.0 200 OK" ' headers en dan het bestand. De headers en het PRINT #1, "Content-Length:" LEN(a$) ' bestand worden door een blanco regel gescheiden PRINT #1, "Content-Type: text/html" ' (zoals ook toegepast wordt bij mail MIME). PRINT #1, "Content-Encoding: gzip" PRINT #1, "Connection: close" PRINT #1, PRINT #1, a$ CLOSE END FUNCTION |
Opgelet: na de compressie wordt het origineel bestand door gzip gewist! Indien het origineel bestand niet gewist mag worden, eerst een copie maken!
Je zal moeten overwegen of het de moeite is van HTML bestanden te comprimeren. Bij gewone pagina's met niet teveel tekst (tot 100 k) is het nutteloos GZIP aan te roepen. De tijd dat je wint door het bestand gecomprimeerd door te sturen verlies je door het programma aan te roepen.
Voor het versturen van real-time pagina's (pagina's die on-the-fly aangemaakt worden) is GZIP compressie zeker aangeraden vanaf een 20-tal kb. Deze pagina's werden reeds door het programma aangemaakt, dus verlies je minder tijd (het programma draait al!). Het versturen van 20 kb (upload van je home account) vraagt ongeveer 1 seconde.
Grafische formaten zoals JPG, PNG en GIF zijn reeds gecomprimeerd, zodat je geen winst zal boeken door het bestand opnieuw met gzip te comprimeren. Je bekomt de hoogste compressie met HTML-bestanden (zich herhalende formateringsopdrachten en redundante tekst) en TXT-bestanden (redundantie, beperkte characterset), maar ook PDF (zonder embedded beelden) comprimeert heel goed.
Individuele landingspage bezoekers: