gzip-Kompression für den HTML-Teil des Requests

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
dermicha
Beiträge: 95
Registriert: Mi 9. Dez 2009, 17:57
Kontaktdaten:

gzip-Kompression für den HTML-Teil des Requests

Beitrag von dermicha » Di 7. Mär 2017, 11:00

Hallo zusammen,

die Standard-htaccess des AMR-Plugins sorgt für die gzip-komprimierte Übertragung aller wichtigen Textdateien. Durch PageSpeed Insights ist mir aufgefallen, dass der eigentliche HTML-Teil eines Requests leider nicht komprimiert wird. Das konnte ich auch durch Änderungen an der htaccess nicht ändern.

Meiner Meinung nach liegt die Ursache in der include.front_content.php, durch folgende Änderung ab Zeile 572 (2 Zeilen auskommentiert, 2 neu) wird auch der HTML-Part komprimiert ausgeliefert:

Code: Alles auswählen

                // Write html output into output buffer and assign it to an
                // variable
//                ob_start();
ob_start("ob_gzhandler");//neu
                eval("?>\n" . $code . "\n<?php\n");
                $htmlCode = ob_get_contents();
//                ob_end_clean();

                // Process CEC to do some preparations before output
                $htmlCode = cApiCecHook::executeAndReturn('Contenido.Frontend.HTMLCodeOutput', $htmlCode);

                // Print output
                echo $htmlCode;
ob_end_flush();//neu
Wenn ich das richtig verstanden habe, komprimiert ob_gzhandler nur dann, wenn der Browser mitgeteilt hat, dass er dies versteht.

Sofern es keine von mir übersehenen Nebenwirkungen gibt, würde ich mich freuen, wenn das Einzug in den Core finden würde.

Viele Grüße

Michael

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von Faar » Di 7. Mär 2017, 14:29

dermicha hat geschrieben:Wenn ich das richtig verstanden habe, komprimiert ob_gzhandler nur dann, wenn der Browser mitgeteilt hat, dass er dies versteht.
So sollte es sein. Die Funktion gibt dann FALSE zurück, wenn es nicht geht.
Sofern es keine von mir übersehenen Nebenwirkungen gibt
ob_gzhandler() komprimiert nur das, was mittels ob_start() gepuffert wird, also "local".
Es kann aber sein, dass der Server bereits mittels zlib.output_compression komprimiert sendet, dann stört da ob_gzhandler().
Und im Zweifel ist scheints zlib.output_compression besser als das locale ob_gzhandler.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

dermicha
Beiträge: 95
Registriert: Mi 9. Dez 2009, 17:57
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von dermicha » Di 7. Mär 2017, 15:13

Vielen Dank für den Hinweis!

In der Tat scheint sogar ein

Code: Alles auswählen

ini_set("zlib.output_compression", "On");
in der config.local.php auszureichen. Ich denke zwar, dass beide Varianten für Contenido auf das Gleiche herauskommen, aber so ist es auf jeden Fall allgemeingültiger und zudem einfacher umzusetzen...

Leo
Beiträge: 308
Registriert: Mi 19. Apr 2006, 19:26
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von Leo » Fr 26. Mai 2017, 13:55

Hallo Contenido-Gemeinde,

ich bekomme das Modul gzip bei mir nicht zum laufen. Bei Strato muss man die entsprechenden Ordner markieren, wo man das Modul benötigt. Phpinfo() zeigt es aber weiterhin als deaktiv an. Ich hatte jetzt versucht über eine Funktion zumindestens die Leerzeichen, Tabs usw. zu entfernen, aber dann wird mein CSS nicht mehr angezeigt. Hat jemand eine Idee woran das liegt? Ich bin gerade irgendwie blind.

VG
Leonhard

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von rethus » Mo 29. Mai 2017, 08:47

Hi Leo,
du sprichst da zwei unterschiedliche Bereiche an.
Gzip ist ja lediglich das komprimieren der zu sendenden Daten. Also er sammelt die Daten, und sendet Sie anstatt nach und nach in einem Rutsch, wobei er die Daten zuvor noch mit nem ZIPer packt.

Das von dir erwähnte entfernen von Tabs und Leerzeichen nennt man minifiying - was erstmal mit gzip nichts zu tun hat.

Zum GZip musst du dich wohl oder übel durch die Gegebenheiten bei deinem Provider wuseln. Hast du denn schon mal die .htaccess-Variante deines Providers ausprobiert?

Bei dem minifying muss man meist ein wenig in die Analyse. Du müsstest dir in der Browser-Konsole ansehen, wo genau er die Fehler produziert, das in dem deminifyed Code suchen, und schauen, ob du an den Stellen den Sourcecode etwas anpassen musst, damit der minifying-Prozess diese Funktionen nicht zerschießt.

Ich nutze eigentlich immer SCSS/SASS in Verbindung mit phpstorm. Der zeigt frühzeitig an, wenn Probleme entstehen.
Empfehlen kann ich dir aber auch den manuellen Weg:
  1. Schreibe in dein layout nen neuen CSS und JS-Tag in dem du deine Künftige JS/CSS Dateien einliest (z.B. style.min.css).
  2. Nun nimmst du die erste CSS, minifizierst :D Sie, und überträgst den Minifizierten Code in style.min.css. (nicht vergessen, die orginal-css zu zuvor aus dem Layout zu entfernen)
  3. Wenn es hier schon Probleme gibt, in die analyse gehen.
Wenn du nicht zurecht kommst, unterstütze ich dich gerne dabei. Einfach via PN mal melden.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Leo
Beiträge: 308
Registriert: Mi 19. Apr 2006, 19:26
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von Leo » Mo 29. Mai 2017, 09:37

Hallo rethus,

dank dir erst einmal für die Antwort!

Für die Komprimierung von CSS und JS verwende ich schon die besagte Klasse Minify, für den CSS-Kram Less. Hier gab es eigentlich keine Problem. Wahrscheinlich habe ich mein Anliegen unklar formuliert. Ich wollte jetzt noch den dynamisch erzeugten HTML-Code komprimieren. Dort wollte ich minify nicht unbedingt verwenden und habe nur eine kleine Funktion eingebaut, die Umlaute, Leerzeichen und Tabs entfernt. Wenn ich diese Funktion aktiviere, wird die Website ungestylt angezeigt. Es muss also an dieser Funktion liegen, oder?

Danke!

VG
Leonhard

P.S.: PHPStorm ist eine schöne IDE, wa?!

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von rethus » Mo 29. Mai 2017, 11:37

Leo hat geschrieben:
Mo 29. Mai 2017, 09:37
Wenn ich diese Funktion aktiviere, wird die Website ungestylt angezeigt. Es muss also an dieser Funktion liegen, oder?
Hi Leo,

ja, davon gehe ich auch aus. Hast du denn mal eine Kontrollausgabe gemacht, was deine Funktion letztendlich ausspuckt?
Vielleicht ist deine Funktion mit "leerzeichen" entfernen etwas zu genau unterwegs. Du musst ja je nach Fall unterscheiden, was für Leerzeichen entfernt werden.
Die Leerzeichen bei <div id="xy"> zu entfernen würde z.B. einige Probleme mit sich bringen weil es den Tag <divid="xy"> nicht gibt :wink:

Warum nimmst du denn nicht minify für den dynamischen HTML-Code?
Leo hat geschrieben:
Mo 29. Mai 2017, 09:37
P.S.: PHPStorm ist eine schöne IDE, wa?!
Jep, seh ich auch so. Läuft einfach flüssig, macht Laune damit zu arbeiten.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Leo
Beiträge: 308
Registriert: Mi 19. Apr 2006, 19:26
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von Leo » Mo 29. Mai 2017, 17:45

Hallo rethus,

ich muss ja die Anpassung direkt in 'include.front_content.php' vornehmen. Wenn ich jetzt die minify-Klasse dort noch reinschraube, habe ich die Sorge, dass das irgendwelche negativen Auswirkungen auf das CM-System hat. Eigentlich fummelt man ja nicht im CMS-Core rum. ;-)

Mmmh, ich hatte die Funktion schon testhalber angepasst. Sprich, sie hat nur Umbrüche entfernt. Dann erschien Sie ebenfalls ungestylt. Mmh ...

VG
Leonhard

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von rethus » Di 30. Mai 2017, 08:25

Du kannst ggf. mit Hooks arbeiten.
Vorab möchte ich erwähnen, das ich in der aktuellen Contenido-Version in Zeile 572 nicht den Code gefunden hast, den du im ersten Thread angegeben hast. Übertrage also meine folgenden Anmerkungen ggf. auf die von dir genutzte Contenido-Version:

Also Ausgangslage ist diese Datei:
https://git.contenido.org/projects/CON/ ... ontent.php

Zeile 737-764:

Code: Alles auswählen

else {
            if ($cfg['debug']['codeoutput']) {
                echo '<textarea>' . conHtmlSpecialChars($code) . '</textarea>';
            }

            // That's it! The code of an article will be evaluated.
            // The code of an article is basically a PHP script which is
            // cached in the database.
            // Layout and Modules are merged depending on the Container
            // definitions of the Template.
            $aExclude = explode(',', getEffectiveSetting('frontend.no_outputbuffer', 'idart', ''));
            if (in_array(cSecurity::toInteger($idart), $aExclude)) {
                eval("?>\n" . $code . "\n<?php\n");
            } else {
                // Write html output into output buffer and assign it to an
                // variable
                ob_start();
                eval("?>\n" . $code . "\n<?php\n");
                $htmlCode = ob_get_contents();
                ob_end_clean();

                // Process CEC to do some preparations before output
                $htmlCode = cApiCecHook::executeAndReturn('Contenido.Frontend.HTMLCodeOutput', $htmlCode);

                // Print output
                echo $htmlCode;
            }
        }
Hier ist der Hook: Contenido.Frontend.HTMLCodeOutput interessant. Der geparste PHP-Code wird ja in $htmlCode geschrieben, und danach durch den Hook geleitet. Hier kannst du dann alles Managen (gzip, minifying usw.).
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Leo
Beiträge: 308
Registriert: Mi 19. Apr 2006, 19:26
Kontaktdaten:

Re: gzip-Kompression für den HTML-Teil des Requests

Beitrag von Leo » Mi 31. Mai 2017, 14:16

Vielen Dank!!! Ich schaue es mir an und berichte. :D VG Leonhard

Antworten