(PHP) Stückweise mit GZip komprimieren
Candid Dauth
- programmiertechnik
0 Ashura0 dedlfix4 Christian Kruse
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
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
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
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";
你好 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.
再见,
克里斯蒂安
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/>
你好 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.
再见,
克里斯蒂安