PageSpeed Insights // gzip Komprimierung per PHP
oxo888oxo
- php
Hallo
Ich schicke meine Seite gerade durch Googles PageSpeed Insights.
Da wird mir dann unter anderem folgendes geraten:
Komprimierung aktivieren
Nun habe ich dazu folgende Webseite gefunden:
Anleitung GZIP-Kompression von Webseiten über PHP
Das habe ich bei mir testweise auch mal auf einen Testseite wie folgt eingesetzt:
<?php ob_start("ob_gzhandler"); ?>
Und ich habe das dann auch kontrolliert.
Und es funktioniert wohl gut.
Nun wollte ich Euch mal fragen, ob Ihr das für sinnvoll haltet.
Also aich meine einmal, ob es grundsätzlich sinnvoll ist, diese gzip Komprimierung anzuwenden?
Und eben auch, ob der Weg, das über PHP zu lösen auch gut ist?
Gruß
Ingo
Moin,
<?php ob_start("ob_gzhandler"); ?>
Nun wollte ich Euch mal fragen, ob Ihr das für sinnvoll haltet.
ja und nein. Das komprimierte Ausliefern von Inhalten ist durchaus sinnvoll und sogar üblich. Aber nein, ich finde es nicht schlau, diesen Schritt in PHP zu erledigen, denn die meisten Webserver sind so konfiguriert, dass sie das sowieso tun.
Wenn das bei dir nicht so ist, kontaktiere deinen Hoster und frag die Jungs (oder Mädels), warum sie keine gzip-Komprimierung konfiguriert haben, und bitte sie, das zu tun.
So long,
Martin
Tach Martin
Wenn das bei dir nicht so ist, kontaktiere deinen Hoster und frag die Jungs (oder Mädels), warum sie keine gzip-Komprimierung konfiguriert haben, und bitte sie, das zu tun.
Ich habe meine Seite bei 1und1 gehostet.
Ich habe dort mal nachgesehen, was die zu gzip sagen/schreiben.
Dabei habe ich das gefunden:
-------------------------------------------------------------
Welche PHP-Einstellungen kann ich ändern?
Sonstige php.ini-Direktiven
Name: zlib.output_compression
Beschreibung: Komprimiert php Dateien im gzip-Format
Werte: On / Off
PHP 5.2: Off
Standard PHP 5.4: Off
-------------------------------------------------------------
Ich verstehe das so, dass gzip erstmal deaktiviert ist, ich es aber aktivieren kann.
Verstehe ich das denn soweit richtig?
Gruß
Ingo
Hallo
Ich habe meine Seite bei 1und1 gehostet.
Ich habe dort mal nachgesehen, was die zu gzip sagen/schreiben.
Dabei habe ich das gefunden:
Welche PHP-Einstellungen kann ich ändern?
Sonstige php.ini-DirektivenName: zlib.output_compression
Beschreibung: Komprimiert php Dateien im gzip-Format
Werte: On / Off
PHP 5.2: Off
Standard PHP 5.4: OffIch verstehe das so, dass gzip erstmal deaktiviert ist, ich es aber aktivieren kann.
Verstehe ich das denn soweit richtig?
Ja. Wenn du den Schalter in deiner Konfigurationsoberfläche nicht findest, frag bei 1unds1 nach. Die sollten ihre Software kennen.
Tschö, Auge
Moin Maddin,
mein Hoster bietet leider kein gzip an.
Würdest du das jetzt über php aktivieren oder nicht?
Gruß
Dhe-Rex
Mahlzeit,
mein Hoster bietet leider kein gzip an.
Würdest du das jetzt über php aktivieren oder nicht?
Ich würde den Hoster wechseln.
Wenn er beim Apache keine Komprimierung macht, das aber bei PHP zur Verfügung stellt, hat IMO ein Wissensdefizit. Das ist Paradox, sowas.
Wenn er beim Apache keine Komprimierung macht, das aber bei PHP zur Verfügung stellt, hat IMO ein Wissensdefizit. Das ist Paradox, sowas.
Nee das Wissensdefizit hab dann wohl ich. Ich bin davon ausgegangen dass es sich um zwei verschiedene verfahren handelt die beide das gleiche Ergebnis haben.
Gruß
Ein hoch auf die Kissenschlacht
T-Rex
Mahlzeit,
Wenn er beim Apache keine Komprimierung macht, das aber bei PHP zur Verfügung stellt, hat IMO ein Wissensdefizit. Das ist Paradox, sowas.
Nee das Wissensdefizit hab dann wohl ich.
Weiss ich nicht, ist ja auch grundsätzlich keine Schande ;)
Ich bin davon ausgegangen dass es sich um zwei verschiedene verfahren handelt die beide das gleiche Ergebnis haben.
Das Verfahren ist gleich (es wird komprimiert) aber das Ergebnis kann(!) unterschiedlich sein. Der Indianer kümmert saich selbst drum ob der CLient Komprimierung unterstützt, in PHP muss du es selbst machen.
Auch werden beim Indiander CSS-, Javascript- und HTML-Dateien ebenfalls komprimiert.Das geht per PHP nur, wenn du sie alle durch den Parser jagst. Und dann hast du zwar ne Komprimierung aber der Zeitvorteil ist mit Sicherheit durch die höhere Verarbeitungszeit dahin.
Also in deiner ersten Antwort hörte sich das so an als ob die Komprimierung allein im Apache stattfindet und php sich dieser Komprimierung bedient. Wenn also jemand eine Komprimierung in php schaffen würde, wäre es auch möglich diese mittels Webserver direkt zu machen.
Mein Hoster bietet aber keine Komprimierung via Indianer oder anderer unterdrückten Rassen an. Ergo wäre es für mich eine feine Sache die Komprimierung mittels php zu lösen. Dann hätte ich zumindest das html komprimiert. Vorraussetzung ist natürlich auch nur dass es schnell erledigt ist. Wenn es bei der einen Zeile bleibt ist das ja eine super Sache.
Gruß
Der T-Rex der an einem viel zu kleinem Bildschirm sitzt
Mahlzeit,
Also in deiner ersten Antwort hörte sich das so an als ob die Komprimierung allein im Apache stattfindet und php sich dieser Komprimierung bedient.
Nein. PHP schickt den erzeugten Code (HTML, CSS, JS ...) an den Indiander und der kümmert sich um die Komprimierung. PHP hat keine Ahnung, was der Indianer mit den Daten macht. Wenn der die nach /dev/null schiebt, bekommt das PHP gar nicht mit.
Hello lieber T-Rex,
Also in deiner ersten Antwort hörte sich das so an als ob die Komprimierung allein im Apache stattfindet und php sich dieser Komprimierung bedient. Wenn also jemand eine Komprimierung in php schaffen würde, wäre es auch möglich diese mittels Webserver direkt zu machen.
Mein Hoster bietet aber keine Komprimierung via Indianer oder anderer unterdrückten Rassen an. Ergo wäre es für mich eine feine Sache die Komprimierung mittels php zu lösen. Dann hätte ich zumindest das html komprimiert. Vorraussetzung ist natürlich auch nur dass es schnell erledigt ist. Wenn es bei der einen Zeile bleibt ist das ja eine super Sache.
Da bastelst Du Dir einfach ein Prepend-Script für PHP.
#---
Kompressionsfunktion deklarieren und definieren
Soll ich kompromieren? (als Setting aus der .htaccess abfragen)
Darf ich komprimieren? (Accept-Compression-Header auswerten, ob der Client das kann)
Ausgabepuffer einschalten
Register-Shutdown-Funktion festlegen (die führt dann die Kompression des Ausgabepuffers durch)
#---
So musst Du in keinem deiner Scripte etwas ändern.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Da bastelst Du Dir einfach ein Prepend-Script für PHP.
#---
Kompressionsfunktion deklarieren und definierenSoll ich kompromieren? (als Setting aus der .htaccess abfragen)
Darf ich komprimieren? Ist mod_deflate oder mod_gzip geladen?
Wie man das mittels PHP am elgeantesten herausfinden kann, weiß ich auch noch nicht.
Im Zweifelsfall ein eingeschränktes phpinfo() in den Buffer müllen und nach dem String suchen.
Jedenfalls wäre eine doppelte Kompression unsinnig.
Darf ich komprimieren? (Accept-Compression-Header auswerten, ob der Client das kann)
Ausgabepuffer einschalten
Register-Shutdown-Funktion festlegen (die führt dann die Kompression des Ausgabepuffers durch)
#---So musst Du in keinem deiner Scripte etwas ändern.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Da bastelst Du Dir einfach ein Prepend-Script für PHP.
#---
Kompressionsfunktion deklarieren und definierenSoll ich kompromieren? (als Setting aus der .htaccess abfragen)
Darf ich komprimieren? Ist mod_deflate oder mod_gzip geladen?
Wie man das mittels PHP am elgeantesten herausfinden kann, weiß ich auch noch nicht.
Im Zweifelsfall ein eingeschränktes phpinfo() in den Buffer müllen und nach dem String suchen.
Jedenfalls wäre eine doppelte Kompression unsinnig.
Du brauchst also:
apache_get_modules() -> ob schon Kompression geladen ist
get_loaded_extensions() -> ob PHP Kompression kann.
das kannst Du ggf. auch mit function_exists() abfragen.
Darf ich komprimieren? (Accept-Compression-Header auswerten, ob der Client das kann)
Ausgabepuffer einschalten
Register-Shutdown-Funktion festlegen (die führt dann die Kompression des Ausgabepuffers durch)
#---So musst Du in keinem deiner Scripte etwas ändern.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Kompressionsfunktion deklarieren und definieren
Soll ich kompromieren? (als Setting aus der .htaccess abfragen)
Darf ich komprimieren? (Accept-Compression-Header auswerten, ob der Client das kann)
Ausgabepuffer einschalten
Register-Shutdown-Funktion festlegen (die führt dann die Kompression des Ausgabepuffers durch)
Tom, alle diese Schritte macht dieser eine Funktionsaufruf automatisch:
ob_start('ob_gzhandler');
Es ist nichts weiter nötig.
So musst Du in keinem deiner Scripte etwas ändern.
Lediglich obiger Code muss ausgeführt werden.
Mathias
Hello Mathias,
Tom, alle diese Schritte macht dieser eine Funktionsaufruf automatisch:
ob_start('ob_gzhandler');
Es ist nichts weiter nötig.
So musst Du in keinem deiner Scripte etwas ändern.
Lediglich obiger Code muss ausgeführt werden.
Fein. Manchmal macht PHP ja wirklich 'was alleine.
http://de1.php.net/manual/en/function.ob-gzhandler.php
Dann muss man ja nur noch nachvollziehen, was geschieht :-)
Berücksichtigt die Funktion auch, ob eine Kompression durch den Webserver selber stattfindet?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Berücksichtigt die Funktion auch, ob eine Kompression durch den Webserver selber stattfindet?
Das kann sie aus architekturellen Gründen nicht zuverlässig tun. Dazu müsste sie die jeweilige Webserver-Konfiguration komplett parsen und verstehen können. Der Vorschlag, .htaccess und die geladenen Apache-Module auszulesen, ist eher eine schwache Heuristik. Apache mit mod_php ist ohnehin nur eine Möglichkeit, wie PHP ausgeführt werden kann.
Eine Kompression durch den Webserver erfolgt nach der Ausführung von PHP, als wäre eher die Frage, ob entsprechende Webserver-Module (z.B. Apaches mod_deflate) die Kompression von PHP berücksichtigen. PHP produziert erst einmal eine HTTP-Response, und der Webserver »darüber« gibt diese durch oder modifiziert sie gegebenenfalls. Ich vermute, sie berücksichtigen die Komprimierung mittels PHP (und komprimieren selbst nicht); ich habe es aber nicht getestet.
Mathias
Hello,
Eine Kompression durch den Webserver erfolgt nach der Ausführung von PHP, als wäre eher die Frage, ob entsprechende Webserver-Module (z.B. Apaches mod_deflate) die Kompression von PHP berücksichtigen. PHP produziert erst einmal eine HTTP-Response, und der Webserver »darüber« gibt diese durch oder modifiziert sie gegebenenfalls. Ich vermute, sie berücksichtigen die Komprimierung mittels PHP (und komprimieren selbst nicht); ich habe es aber nicht getestet.
Ich probiere das morgen mal aus.
php's komprimierer setzt ja vermutlich einen compression-header. Den koennte der apache dann beruecksichtigen.
ich bin nur ueber die duerftige Beschreibung im php-manual enttaeuscht. Da stehen 10 Jahre alte UCNs drin, aber keine weiteren Angaben zur Funktionsweise.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Ich probiere das morgen mal aus.
php's komprimierer setzt ja vermutlich einen compression-header. Den koennte der apache dann beruecksichtigen.
Der Header heißt: Content-Encoding: gzip
Wann PHP den setzt, weiß ich nicht. Jedenfalls wird er in der Liste der Headers (headers_list()) noch nicht angezeigt und mittels apache_response_headers() ist er auch noch nicht zu sehen.
Im Output erscheint dann allerdings
mit php's ob_gzhandler:
http://testserver.lan/http-headers/get_headers.php
GET /http-headers/get_headers.php HTTP/1.1
Host: testserver.lan
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://testserver.lan/http-headers/
Cookie: adam=Mann; eve=Frau; snake=b%C3%B6se
Connection: keep-alive
Cache-Control: max-age=0
HTTP/1.1 200 OK
Date: Sun, 29 Jun 2014 09:43:11 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/0.9.8y PHP/5.4.22
X-Powered-By: PHP/5.4.22
Set-Cookie: adam=Mann
Set-Cookie: eve=Frau
Set-Cookie: snake=b%C3%B6se
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 871
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; Charset=utf-8;
Wenn man nun ob_start('gz_handler'); in PHP weg lässt und stattdessen in die .htaccess die Direktive
## .htaccess
SetOutputFilter DEFLATE
aufnimmt, übernimmt der Apache die Kopression. Voraussetzung dafür ist, dass das mod_deflate geladen ist. Es gibt dann leichte Unterschiede bei der Kompression.
mit mod_deflate:
http://testserver.lan/http-headers/get_headers.php
GET /http-headers/get_headers.php HTTP/1.1
Host: testserver.lan
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://testserver.lan/http-headers/
Cookie: adam=Mann; eve=Frau; snake=b%C3%B6se
Connection: keep-alive
Cache-Control: max-age=0
HTTP/1.1 200 OK
Date: Sun, 29 Jun 2014 09:41:46 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/0.9.8y PHP/5.4.22
X-Powered-By: PHP/5.4.22
Set-Cookie: adam=Mann
Set-Cookie: eve=Frau
Set-Cookie: snake=b%C3%B6se
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 861
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; Charset=utf-8;
~~~.
Eigentlich hat der Quelltext nur ein Byte unterschied für die Auskommentiereung des ob\_start('ob\_gzhandler'). Das File wird als Payload mitgesendet.
Das wichtigste ist wohl, dass es nicht kracht, wenn beide Kompressionen eingeschaltet sind. Der Apache scheint also darauf zu achten, ob bereits eine Kompression vorliegt.
Wie man sieht, benutzt aber auch mod\_deflate die Kompressionsart gzip. Ein anderes Modul habe ich nicht geladen.
Interessant für den Fragesteller dürfte noch sein, dass der unkompromierte Content ca. dreimal so groß war.
ohne Kompression
~~~http
HTTP/1.1 200 OK
Date: Sun, 29 Jun 2014 09:44:54 GMT
Server: Apache/2.4.7 (Win32) OpenSSL/0.9.8y PHP/5.4.22
X-Powered-By: PHP/5.4.22
Set-Cookie: adam=Mann
Set-Cookie: eve=Frau
Set-Cookie: snake=b%C3%B6se
Content-Length: 2100
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; Charset=utf-8;
PHP hat ebenfalls mehrere Module zur Kompression:
* zip
* zlib
* bz2
ob da nun zip oder zlib verantwortlich ist, weiß ich nicht.
Mit ob_start('ob_deflatehandler') gab es bei mir übrigens nur eine Fehlermeldung.
ich bin nur ueber die duerftige Beschreibung im php-manual enttaeuscht. Da stehen 10 Jahre alte UCNs drin, aber keine weiteren Angaben zur Funktionsweise.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
<?php ob_start("ob_gzhandler"); ?>
Nun wollte ich Euch mal fragen, ob Ihr das für sinnvoll haltet.ja und nein. Das komprimierte Ausliefern von Inhalten ist durchaus sinnvoll und sogar üblich. Aber nein, ich finde es nicht schlau, diesen Schritt in PHP zu erledigen, denn die meisten Webserver sind so konfiguriert, dass sie das sowieso tun.
Wenn er es durch PHP tun lässt, müsste er sinnvollerweise den Mechanismus in Apache ausschalten. Und soweit ich weiß, müsste er auch in PHP die Prüfung selber durchführen, ob der Client überhaupt mit Komprimierung umgehen kann. (Accept-Header).
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
guck erstmal z.B. mit phpinfo() nach, welche Module der Apache geladen hat.
Mod_deflate ist eigentlich Standard. Mod_gzip wäre schon Extraleistung.
Die Clients melden im Accept_Compression-header meistens beide Möglichkeiten.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo Tom
Mod_deflate ist eigentlich Standard.
Mod_gzip wäre schon Extraleistung.
Ich habe es nun per php.ini mit zlib.output_compression = on
gemacht.
Das ist wohl der Weg, den man bei 1und1 gehen soll/muss.
Funktioniert auch.
Gruß
Ingo
Hallo,
Mod_deflate ist eigentlich Standard.
Mod_gzip wäre schon Extraleistung.
Ich habe es nun per php.ini mitzlib.output_compression = on
gemacht.
das ist aber sch... äh, schade, weil dann statische Ressourcen (HTML, CSS, JS) nicht komprimiert ausgeliefert werden, sondern nur mit PHP generierte Ressourcen.
Das ist wohl der Weg, den man bei 1und1 gehen soll/muss.
Mag sein. Passt zu dem Laden. Als Internet-Zugangsprovider bin ich äußerst zufrieden mit denen; als Webhoster würde ich sie nicht nutzen wollen.
Funktioniert auch.
Klar, man kann auch konzentrierte Salzsäure und Natronlauge zusammenkippen und dann Wiener Würstchen reintun. Heiß werden sie auf jeden Fall, und gesalzen sind sie dann außerdem.
Funktioniert auch.
Ciao,
Martin
Mag sein. Passt zu dem Laden. Als Internet-Zugangsprovider bin ich äußerst zufrieden mit denen; als Webhoster würde ich sie nicht nutzen wollen.
Dem kann ich nur zustimmen.
Funktioniert auch.
Klar, man kann auch konzentrierte Salzsäure und Natronlauge zusammenkippen und dann Wiener Würstchen reintun. Heiß werden sie auf jeden Fall, und gesalzen sind sie dann außerdem.
Funktioniert auch.
Das find ich gerade irgendwie herrlich :3
MfG
bubble
Hello,
Klar, man kann auch konzentrierte Salzsäure und Natronlauge zusammenkippen und dann Wiener Würstchen reintun. Heiß werden sie auf jeden Fall, und gesalzen sind sie dann außerdem.
Funktioniert auch.
Das find ich gerade irgendwie herrlich :3
Dann hast Du es schon als Zitat vorgeschlagen?
http://community.de.selfhtml.org/zitatesammlung/index.php
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg