GZIP PHP-Code von PHPbb...mal ne frage

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Novan
Mitglied
Beiträge: 17
Registriert: 24.11.2002 17:17

GZIP PHP-Code von PHPbb...mal ne frage

Beitrag von Novan »

Hi,
ich habe schon seit einem Jahr GZIP im Forum aktiviert und nun haben wir ne neue Homepage und dort wollte ich das auch mal einbauen also habe ich mir mal den Code für GZIP beim Forum angeschaut und habe die Befürchtung :
"Obwohl ich GZIP eingeschaltet habe, wird es vom Forum nicht angewendet"

In der PageHeader.php steht folgender Code:

Code: Alles auswählen

//
// gzip_compression
//
$do_gzip_compress = FALSE;
if ( $board_config['gzip_compress'] )
{
	$phpver = phpversion();

	$useragent = (isset($_SERVER["HTTP_USER_AGENT"]) ) ? $_SERVER["HTTP_USER_AGENT"] : $HTTP_USER_AGENT;

	if ( $phpver >= '4.0.4pl1' && ( strstr($useragent,'compatible') || strstr($useragent,'Gecko') ) )
	{
		if ( extension_loaded('zlib') )
		{
			ob_start('ob_gzhandler');
		}
	}
	else if ( $phpver > '4.0' )
	{
		if ( strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip') )
		{
			if ( extension_loaded('zlib') )
			{
				$do_gzip_compress = TRUE;
				ob_start();
				ob_implicit_flush(0);

				header('Content-Encoding: gzip');
			}
		}
	}
}
Ich habe GZIP aktiviert also ist die erste IF-Anweisung TRUE dann schaut er ob die PHP-Version größer 4.0.4pl1 und ich habe 4.3.0 und verwende den IE 6.0SP1 also geht er auch in diese IF-Anweisung und nicht in die ELSEIF-Anweisung. Dann ladet er erfolgreich die zlib-extension und startet das Outputbuffering. Die ELSEIF überspringt er dann und das war der GZIP-Teil im Headerteil des Forum.
Nach dem Teil ist die $do_gzip_compress immer noch False anstatt true da die nur im ELSEIF-Teil true gesetzt wird.

In der PageTail.php siehts wie folgt nun aus:

Code: Alles auswählen

//
// Compress buffered output if required and send to browser
//
if ( $do_gzip_compress )
{
	//
	// Borrowed from php.net!
	//
	$gzip_contents = ob_get_contents();
	ob_end_clean();

	$gzip_size = strlen($gzip_contents);
	$gzip_crc = crc32($gzip_contents);

	$gzip_contents = gzcompress($gzip_contents, 9);
	$gzip_contents = substr($gzip_contents, 0, strlen($gzip_contents) - 4);

	echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
	echo $gzip_contents;
	echo pack('V', $gzip_crc);
	echo pack('V', $gzip_size);
}
Da $do_gzip_compress im Header nicht = TRUE gesetzt wurde überspringt er den Teil und macht keinen GZIP

Ist das nicht ein Codefehler? Er läd die zlib extension extra im header ein und verwendet sie dann nicht zur kompression. Ist mir Spanisch wieso er kein GZIP verwendet wenn ich es anstelle und mein Server stellt die nötige Extensions ja zur verfügung.

Hat wer damit erfahrung?
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: GZIP PHP-Code von PHPbb...mal ne frage

Beitrag von Pyramide »

Novan hat geschrieben:Er läd die zlib extension extra im header ein und verwendet sie dann nicht zur kompression.
Das ist nicht richtig. extension_loaded prüft, ob die extension geladen wurde (d.h. einkompiliert bzw. in php.ini aktiviert). Die Kompression wird mit ob_start("ob_gzhandler") aktiviert.

Näheres dazu findest du in der englischen Dokumentation zu ob_start: http://de.php.net/manual/en/function.ob-start.php . Die deutsche Version ist leider ziemlich veraltet, sie listet die Funktion noch als ob_start(void) und erwähnt auch ob_gzhandler nicht.
Novan
Mitglied
Beiträge: 17
Registriert: 24.11.2002 17:17

Beitrag von Novan »

hmm ok langsam steige ich dahinter.
Wenn ich

Code: Alles auswählen

ob_start('ob_gzhandler');
schreibe dann ist das schon die komprimierung des Buffers...das macht dann wohl die zlib extension

Ich habe aber nun 2 Caches in einander verschachtelt. Einmal fürs Framework und einmal für den Content und wenn ich 2x diese anweisung schreibe sagt er das er sie nur einmal ausführen kann.

Wie kann man dieses komprimieren mit 2
ob_start();
ob_start();
vollbringen?
Novan
Mitglied
Beiträge: 17
Registriert: 24.11.2002 17:17

Beitrag von Novan »

Najo habe das ganze System nun von 2 Outputbuffers auf einen umgestellt. Bedeutet zwar mehr arbeit für den Server aber nun läufts.

Nun startet er den Outputbuffer und cached die Seite zwischen. Wenn kein Fehler passiert geht er die Seite durch und gibt sie aus. Sollte ein Fehler passieren springt er in eine Fehlerbehandlungsfunktion die den Buffer löscht und die Seite noch mal komplett neu generiert (desshalb mehr arbeit für den Server)
Antworten

Zurück zu „Coding & Technik“