Tutorials
HTTP compressie
Pak je website in met gzip, en zie de verschillen. Dus ga snel naar de eerste pagina>>
Pagina 1
Inleiding
HTTP compressie wordt sinds +/- 1999 toegepast, dit is vast gelegd in de HTTP 1.1 standaard. Ik ben er net gisteren achter gekomen wat het is en hoe je het kunt toepassen. Ik kon hierover nog niets vinden op PHPhulp dus daarom deze tutorial. Hieronder zal ik even kort het principe uitleggen:
De webserver pakt alles wat je naar de browser wilt versturen in.
Hierdoor wordt het gene wat moet worden verstuurd aanzienlijk kleiner.
Een compressie verhouden van 1 op 40 is heel normaal, uiteraard is dit afhankelijk van de hoeveelheid data dat wordt ingepakt.
Iedere browser die HTTP 1.1 ondersteund kan de data weer uitpakken, ondersteund de browser geen HTTP 1.1 dan wordt de data niet ingepakt. Ga er maar vanuit dat bijna iedere browser HTTP compressie ondersteund.
Het nadeel is dat de webserver hierdoor iets meer wordt belast. Maar ik denk dat dit niet opweegt tegen de voordelen van o.a. minder bandbreedte verbruik en dat de website sneller geladen wordt.
Op de volgende pagina laat ik een mogelijke implementatie zien van HTTP compressie.
De webserver pakt alles wat je naar de browser wilt versturen in.
Hierdoor wordt het gene wat moet worden verstuurd aanzienlijk kleiner.
Een compressie verhouden van 1 op 40 is heel normaal, uiteraard is dit afhankelijk van de hoeveelheid data dat wordt ingepakt.
Iedere browser die HTTP 1.1 ondersteund kan de data weer uitpakken, ondersteund de browser geen HTTP 1.1 dan wordt de data niet ingepakt. Ga er maar vanuit dat bijna iedere browser HTTP compressie ondersteund.
Het nadeel is dat de webserver hierdoor iets meer wordt belast. Maar ik denk dat dit niet opweegt tegen de voordelen van o.a. minder bandbreedte verbruik en dat de website sneller geladen wordt.
Op de volgende pagina laat ik een mogelijke implementatie zien van HTTP compressie.
Pagina 2
De code
HTTP compressie in PHP is best makelijk te realiseren.
Hieronder wat voorbeeld code en dan de uitleg:
<?php
error_reporting(E_ALL);
$iTime = array_sum(explode(' ', microtime()));
//ob_start('ob_gzhandler');
ob_start('_gzhandler');
function _gzhandler( $_mData, $_iLevel )
{
$bDebug = true;
# $_iLevel is standaard 5
$_iLevel = 2;
# Accepteerd de client gzip, zo ja gaat de compressie goed
if( strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') === false
|| ($mResult = gzencode($_mData, $_iLevel)) === false )
{
return false;
}
# Debug info weergeven in de statusbalk
# Nadeel is wel dat we voor een 2e keer de content
# gaan inpakken, maar ja dit is debug mode he.
if( $bDebug )
{
$iLen = strlen($_mData);
$iLen_c = strlen($mResult);
$_mData .= '<script>window.status=\'length: ' . $iLen . ' / ' . $iLen_c .
' ratio: 1 / ' . round($iLen/$iLen_c, 2) . ' level: ' . $_iLevel . '\';</script>';
$mResult = gzencode($_mData, $_iLevel);
}
# Verstuur header en content
header('Content-Encoding: gzip');
return $mResult;
} # End function _gzhandler
echo '<html><title>blaat</title><head></head><body>
blaat blaat blaat blaat blaat blaat blaat blaat
blaat blaat blaat blaat blaat blaat blaat blaat
blaat blaat blaat blaat blaat blaat blaat blaat
blaat blaat blaat blaat blaat blaat blaat blaat
</body></html>';
echo round(array_sum(explode(' ', microtime())) - $iTime, 4);
?>
We zullen even door de code heel lopen:
- regel 2: Alles wat er verkeerd gaan willen we graag kunnen zien.
- regel 4 en 51: Berekenen van de uitvoertijd;
- regel 6 en 7: PHP functie "ob_start" deze roept de functie aan die in de parameter is opgegeven als "output buffering" stop of het script wordt afgesloten.
Mijn eigen functie "_gzhandler" is vergelijkbaar met de PHP functie "ob_gzhandler". Met als verschil dat als de browser geen HTTP 1.1 heeft dan ziet de gebruiker niets omdat de functie "ob_gzhandler" dan boolean false terug geeft.
- regel 9 t/m 41: De "_gzhandler" functie, deze is al redelijk goed uitgelegd.
In de functie zie je de variabele "$bDebug" staan, zet deze op false om geen informatie meer in de statusbalk te krijgen;
- regel 43 t/m 48: De uitvoer, speel hier wat mee om te kijken wat de compressie verhouden wordt bij verschillende hoeveelheden data. In dit voorbeeld is de verhouden 1 / 3.25. De data is dus 3.25 keer kleiner geworden, de webserver kan dus 3.25 keer meer data versturen voor deze hoeveelheid gegevens.
Ik hoop dat je wat hebt opgestoken van deze tutorial en dat je weer wat nieuwe dingen hebt geleerd.
Hieronder wat voorbeeld code en dan de uitleg:
<?php
error_reporting(E_ALL);
$iTime = array_sum(explode(' ', microtime()));
//ob_start('ob_gzhandler');
ob_start('_gzhandler');
function _gzhandler( $_mData, $_iLevel )
{
$bDebug = true;
# $_iLevel is standaard 5
$_iLevel = 2;
# Accepteerd de client gzip, zo ja gaat de compressie goed
if( strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') === false
|| ($mResult = gzencode($_mData, $_iLevel)) === false )
{
return false;
}
# Debug info weergeven in de statusbalk
# Nadeel is wel dat we voor een 2e keer de content
# gaan inpakken, maar ja dit is debug mode he.
if( $bDebug )
{
$iLen = strlen($_mData);
$iLen_c = strlen($mResult);
$_mData .= '<script>window.status=\'length: ' . $iLen . ' / ' . $iLen_c .
' ratio: 1 / ' . round($iLen/$iLen_c, 2) . ' level: ' . $_iLevel . '\';</script>';
$mResult = gzencode($_mData, $_iLevel);
}
# Verstuur header en content
header('Content-Encoding: gzip');
return $mResult;
} # End function _gzhandler
echo '<html><title>blaat</title><head></head><body>
blaat blaat blaat blaat blaat blaat blaat blaat
blaat blaat blaat blaat blaat blaat blaat blaat
blaat blaat blaat blaat blaat blaat blaat blaat
blaat blaat blaat blaat blaat blaat blaat blaat
</body></html>';
echo round(array_sum(explode(' ', microtime())) - $iTime, 4);
?>
We zullen even door de code heel lopen:
- regel 2: Alles wat er verkeerd gaan willen we graag kunnen zien.
- regel 4 en 51: Berekenen van de uitvoertijd;
- regel 6 en 7: PHP functie "ob_start" deze roept de functie aan die in de parameter is opgegeven als "output buffering" stop of het script wordt afgesloten.
Mijn eigen functie "_gzhandler" is vergelijkbaar met de PHP functie "ob_gzhandler". Met als verschil dat als de browser geen HTTP 1.1 heeft dan ziet de gebruiker niets omdat de functie "ob_gzhandler" dan boolean false terug geeft.
- regel 9 t/m 41: De "_gzhandler" functie, deze is al redelijk goed uitgelegd.
In de functie zie je de variabele "$bDebug" staan, zet deze op false om geen informatie meer in de statusbalk te krijgen;
- regel 43 t/m 48: De uitvoer, speel hier wat mee om te kijken wat de compressie verhouden wordt bij verschillende hoeveelheden data. In dit voorbeeld is de verhouden 1 / 3.25. De data is dus 3.25 keer kleiner geworden, de webserver kan dus 3.25 keer meer data versturen voor deze hoeveelheid gegevens.
Ik hoop dat je wat hebt opgestoken van deze tutorial en dat je weer wat nieuwe dingen hebt geleerd.
Reacties
0