[PHP] ob_gzhandler()

03/19/2012 20:52 PseudoPsycho#1
Hallo, Leute!
Ich habe mir heute einige PHP-Funktionen angesehen, für die ich bislang wenig Verwendung hatte.
Verwende ich:
PHP Code:
ob_start('ob_gzhandler'); 
alleine, wird die Datei komprimiert.

Verwende ich
PHP Code:
ob_start();
echo 
'Hallo, Welt!';
$inhalt=ob_get_contents();
ob_end_clean();
echo 
$inhalt
so steht mir die Variable $inhalt zur weiteren Bearbeitung zur Verfügung.

Nun zu meiner Frage:
Wenn ich
PHP Code:
ob_start('ob_gzhandler');
echo 
'Hallo, Welt!';
$inhalt=ob_get_contents();
ob_end_clean();
echo 
$inhalt
benutze, sollte ich eigentlich die Variable $inhalt mit der komprimierten Seite erhalten, doch stattdessen erhalte ich bei meinem Hoster einen 503-Fehler..?

Was mache ich also falsch und welche Alternativen habe ich (z.B. Variable nachträglich gzip-komprimieren)?
03/20/2012 14:26 Mashkin#2
Quote:
Originally Posted by PseudoPsycho View Post
Nun zu meiner Frage:
Wenn ich
PHP Code:
ob_start('ob_gzhandler');
echo 
'Hallo, Welt!';
$inhalt=ob_get_contents();
ob_end_clean();
echo 
$inhalt
benutze, sollte ich eigentlich die Variable $inhalt mit der komprimierten Seite erhalten, doch stattdessen erhalte ich bei meinem Hoster einen 503-Fehler..?

Was mache ich also falsch und welche Alternativen habe ich (z.B. Variable nachträglich gzip-komprimieren)?
Bleibt der Fehler auch bestehen, wenn du das "echo $inhalt;" entfernst?
BTW: Ein Kommentar auf PHP.net sagt:
Quote:
if you use ob_start with a callback function as a parameter, and that function changes ob string (as in example in manual) don't expect that ob_get_contents will return changed ob.
it will work as you would use ob_start with no parameter at all. So don't be confused.
Also scheint es generell einen gewissen Konflikt mit Callback-Methoden zu geben... :o

Eine u. Umständen sogar bessere Methode ist Apache's "mod_deflate".
Hier mal ein kleins Beispiel für eine ".htaccess"-Datei inklusive Browser-Prüfung (manche Browser unterstützen deflate nicht oder nur teilweise):
Code:
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4         gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSIE             !no-gzip !gzip-only-text/html
</IfModule>[FONT=verdana]
[/FONT]
03/20/2012 18:58 PseudoPsycho#3
Hab' ne andere Möglichkeit gefunden...
Ich bearbeite einfach stattdessen die Variable $inhalt
mit dieser Funktion:
PHP Code:
function compress_gzip($tpl_source)
{
   
$compression_level   =   9;
   
   
$force_compession   =   false;  
   
   if( !
headers_sent() && extension_loaded('zlib') && (strstr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') || $force_compession ))
{
$tpl_source gzencode($tpl_source$compression_level);
      
      
header('X-Compression: gzip');
      
header('Content-Encoding: gzip');
      
header('Vary: Accept-Encoding');
      
header('Content-Length: '.strlen($tpl_source));
            
}
   
return 
$tpl_source;