Candid Dauth: (PHP) Stückweise mit GZip komprimieren

Heißa, alle,

ich lasse per PHP eine sehr lange Seite erzeugen, mehrere MB groß. Diese Seite kann zwar von Normalbenutzern nicht aufgerufen werden, aber trozdem erzeugt sie doch etwas Traffic und braucht auch ihre Zeit zu laden, weshalb ich mir überlegte, sie jetzt GZip-komprimiert zu übertragen.

Ich habe leider keinen Zugriff auf irgendwelche PHP-Konfigurationseinstellungen, weshalb ich das ganze per ob_start('ob_gzhandler'); machen muss. Jetzt ist das Problem, dass teilweise irgendwann der interne PHP-Speicher von 8 MB mit der Seite voll ist und abgebrochen wird. Zudem kommt nichtmal eine Fehlermeldung, da diese anscheinend immernoch vom Output Buffer verschluckt wird.

Ich habe mir also überlegt, ob es nicht möglich wäre, immer ein Stück der auszugebenden Seite zu komprimieren und dieses dann auszugeben, damit es nicht den Hauptspeicher von PHP blockiert. Ich frage mich nun, ob das so überhaupt von Seiten GZip möglich ist und wie groß diese Stücke sein müssen/dürfen.

Kann ich einfach beliebig große Abschnitte einzeln komprimieren und diese hintereinander ausgeben? Oder ist eine bestimmte Blockgröße einzuhalten? Oder ist mein Vorhaben überhaupt nicht zu realisieren?

Gautera!
Grüße aus Biberach Riss,
Candid Dauth

--
„Bevorzuge Gerechtigkeit auch dann, wenn sie deinen eigenen Nachteil bedeutet.“ | Mein SelfCode
http://cdauth.de/
  1. puts "Hallo " + gets.chomp + "."

    ?> Candid
    => Hallo Candid.

    Kann ich einfach beliebig große Abschnitte einzeln komprimieren und diese hintereinander ausgeben? Oder ist eine bestimmte Blockgröße einzuhalten? Oder ist mein Vorhaben überhaupt nicht zu realisieren?

    Hilft dir ob_flush ein wenig?

    Einen schönen Donnerstag noch.

    Gruß, Ashura

    --
    Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Day 20: search.ini
    Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
    [Deshalb frei! - Argumente pro freie Software]
    1. Heißa, Ashura,

      Irgendwie hab ichs gewusst, dass du es wärst, der mir als erster antworten würde. Gedankenverbindungen? ;-)

      Hilft dir ob_flush ein wenig?

      Nein, mein Problem liegt nicht in der Umsetzung in PHP, sondern daran, welche Möglichkeiten GZip hier bietet. PHP beherrsche ich ausreichend, um eventuelle Lösungen dann zu realisieren.

      Aber danke trotzdem für deine Bemühungen. :-)

      Gautera!
      Grüße aus Biberach Riss,
      Candid Dauth

      --
      „Erwecke niemals bei jemandem dem Eindruck, dass er etwas anders machen solle, weil er es anders macht als du, wenn er es besser macht als du.“ | Mein SelfCode
      http://cdauth.de/
  2. ini_set('zlib.output_compression', 1);
    echo $begrüßung;

    sehr lange Seite ... GZip-komprimiert zu übertragen.

    Ich habe leider keinen Zugriff auf irgendwelche PHP-Konfigurationseinstellungen, weshalb ich das ganze per ob_start('ob_gzhandler'); machen muss.

    Und du bist sicher, dass du auch kein zlib.output_compression verwenden kannst? Das ist ein PHP_INI_ALL-Konfigurationsparameter und kann demzufolge auch in user scripts eingestellt werden.

    Kann ich einfach beliebig große Abschnitte einzeln komprimieren und diese hintereinander ausgeben?

    Und wenn man dieser user contributed note Glauben schenken darf, dann sollte das dein Problem besser als ein vergewohltätigtes output buffering lösen.

    echo "$verabschiedung $name";

  3. 你好 Candid,

    Ich habe mir also überlegt, ob es nicht möglich wäre, immer ein Stück der
    auszugebenden Seite zu komprimieren und dieses dann auszugeben, damit es
    nicht den Hauptspeicher von PHP blockiert.

    Dafür kannst du einerseits gz_flush() nutzen (in dem Fall wird der Puffer
    geleert) oder, alternativ, die PHP daisychain stream wrappers:

      
    header("Content-Encoding: gzip");  
      
    $fp = gzopen("php://stdout","wb6");  
    gzwrite($fp,"dies ist ein test!");  
    // ...  
    gzwrite($fp,"dies ist der zweite test!");  
    
    

    Ich frage mich nun, ob das so überhaupt von Seiten GZip möglich ist und
    wie groß diese Stücke sein müssen/dürfen.

    Gzip kann streamend komprimieren, der Inhalt vom Ende muss am Anfang nicht
    bekannt sein.

    Kann ich einfach beliebig große Abschnitte einzeln komprimieren und diese
    hintereinander ausgeben?

    So ohne weiteres nicht, sie müssen alle aus demselben Gzip-Stream kommen.

    再见,
    克里斯蒂安

    --
    Mensch zu Mathematiker: "Ich finde Ihre Arbeit ziemlich monoton". Mathematiker: "Mag sein! Dafür ist sie aber stetig und unbeschränkt."
    http://wwwtech.de/
    1. Heißa, Christian,

      Dafür kannst du einerseits gz_flush() nutzen (in dem Fall wird der Puffer
      geleert)

      gz_flush() scheint es laut Manual nicht zu geben. Wohl gibt es bz_flush(), was aber was etwas anderes zu machen scheint.

      alternativ, die PHP daisychain stream wrappers:

      header("Content-Encoding: gzip");

      $fp = gzopen("php://stdout","wb6");
      gzwrite($fp,"dies ist ein test!");
      // ...
      gzwrite($fp,"dies ist der zweite test!");

        
      Vielen Dank, das ist eine interessante Lösung. Ich werde sie gleich nachher ausprobieren. Da ich aber komischerweise die ganzen gz-Funktionen noch gar nicht kannte, hast du mir damit auch schon in anderer Hinsicht weitergeholfen.  
        
      Wie sieht es aus, muss man als Kompressionsgrad für die Übertragung zum Browser immer 6 angeben?  
        
        
      Gautera!  
      Grüße aus [Biberach Riss](http://www.stadt-biberach.de/),  
      Candid Dauth  
      
      -- 
      „Verwende niemals einen Vorteil, den dir ein anderer verschafft hat, zu deinem eigenen Nutzen.“ | [Mein SelfCode](http://files.cdauth.de/selfforum/redirect_selfcode.php)  
        
      <http://cdauth.de/>  
        
      
      
      1. 你好 Candid,

        Dafür kannst du einerseits gz_flush() nutzen (in dem Fall wird der
        Puffer geleert)

        gz_flush() scheint es laut Manual nicht zu geben...

        Sorry, ich meinte ob_flush().

        Wie sieht es aus, muss man als Kompressionsgrad für die Übertragung zum
        Browser immer 6 angeben?

        Nein, kannst du auch höher (bis maximal 9) einstellen. Aber mehr als 6 bringt
        idR nicht viel, weil das Kosten-Nutzen-Verhältnis zu hoch wird: sehr viel
        mehr Prozessorzeit für wenig bessere Kompression.

        再见,
        克里斯蒂安

        --
        Kommt ein Nullvektor zum Psychiater: "Herr Doktor, ich bin orientierungslos!"
        http://wwwtech.de/