De code
HTTP compressie in PHP is best makelijk te realiseren.
Hieronder wat voorbeeld code en dan de uitleg:
Code (php)
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
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
<?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);
?>
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.