Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] gzip "problem"

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] gzip "problem"

    Hi alle zusammen,

    ich bin momentan dabei mich mit der komprimierung von css und js Dateien auseinanderzusetzen. Ich habe bereits ein Skript geschrieben das mir die geforderten Css/Js Dateien lädt, komprimiert und als komprimierte .gz Datei abspeichert. Eingebunden wird das ganze z.B. bei Css als php-datei mit dem skript.

    Hier also die einbindung des skripts:
    PHP-Code:
    <LINK rel="stylesheet" type="text/css" href="Css/include.css.php"
    und hier das skript (nich vollständig!):
    PHP-Code:
    /**
    ------------------------------------------------------------------------
    Header senden:
    ------------------------------------------------------------------------
    */
    header('content-type: text/css; charset: UTF-8');
    header('Accept-Encoding: gzip');
    header('Vary: Accept-Encoding');
    header('Content-Encoding: gzip');
    header('Last-Modified: 'gmdate('D, d M Y H:i:s') .' GMT');
    header('cache-control: must-revalidate');

    /**
    ------------------------------------------------------------------------
    Dateien durchlaufen:
    ------------------------------------------------------------------------
    */
    for ($i 0$i count($aFiles); $i++)
    {
        
    $sFile $aFiles[$i];
        
        
    $sCssFile $sFile .'.css';
        
    $sGzFile  'gz/'$sFile .'.css.gz';
        
    $sContent '';

        
    // Pruefen ob Css-Datei existiert
        
    if (file_exists($sCssFile))
        {
            
    // Browserspezifisch einbinden?
            
    if (empty($sBrowser) OR $sBrowser == getBrowser())
            {
                
    // Komprimierte Datei vorhanden und noch aktuell?
                
    if (file_exists($sGzFile) AND
                    (
    filemtime($sGzFile) >= filemtime($sCssFile)))
                {
                    
    // Komprimierte Datei laden
                    
    $sContent file_get_contents($sGzFile);
                }
                else
                {
                    
    // Css Datei laden
                    
    $sContent file_get_contents($sCssFile);
                    
                    
    // Manuelle komprimierung
                    
    $sContent clean_css_code($sContent);
                    
                    
    // Gzip komprimierung
                    
    $sContent gzencode($sContent6);
                    
                    
    // In Datei schreiben
                    
    file_put_contents($sGzFile$sContent);
                    
                    
    $bNew false;
                }
            }
        }

        
    // Inhalt ausgeben
        
    echo $sContent;

    Funktionen: getBrowser(liefert einfach den aktuellen Browsernamen) und clean_css_code(entfernt kommentare usw.)

    Das Problem ist nun das bei dem Codec mit gzip anscheinend nur einmal eine ausgabe erzeugt werden kann. Ich habe es auch schon mit ob_start() versucht, dies klappte aber nicht. Ich möchte vorerst versuchen alle Css-Dateien in einer Datei einzubinden, d.h. also ohne weitere http-Requests. Nicht wundern wegen der for-schleife anstatt einer foreach schleife, ist zu testzwecken. er läuft definitiv die schleife 2 mal!

    Ich hoffe ich habe es einigermaßen verständlich erklärt.

    Schonmal danke
    Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
    Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.

  • #2
    Morgen,
    Das Problem ist nun das bei dem Codec mit gzip anscheinend nur einmal eine ausgabe erzeugt werden kann.
    mir wird das Problem dabei leider nicht ganz klar. Wieso sollte nur eine Ausgabe möglich sein? Bekommst du eine Fehlermeldung oder ist der Inhalt der Datei dann nicht vollständig? Geht es um diese Ausgabe
    Code:
    // Inhalt ausgeben
    echo $sContent;
    ?

    Dann mach die Ausgabe doch nach der Schleife!

    Gruß
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Accept-Encoding ist ein Request-Header. Er ist nur für Anfragen gedacht (also für die Nachrichten, die der Client an den Server sendet), nicht für Antworten (die der Server an den Client sendet).

      Zitat von Codercrush Beitrag anzeigen
      Das Problem ist nun das bei dem Codec mit gzip anscheinend nur einmal eine ausgabe erzeugt werden kann.
      Nö, es kann beliebig oft eine Ausgabe erzeugt werden. Es bleibt aber nur die letzte CSS-Datei in der komprimierten Datei übrig. Die anderen überschreibst du mit [MAN]file_put_contents[/MAN].

      Zitat von Asipak Beitrag anzeigen
      Dann mach die Ausgabe doch nach der Schleife!
      Das hätte auch den Vorteil, das du ein
      PHP-Code:
      header('Content-Length: ' strlen($sContent)); 
      senden kannst.
      Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

      Kommentar


      • #4
        @Asipak:

        also ich bekomm immer nur den inhalt der ersten Datei. er läuft aber definitv 2 mal durch, denn er erstellt mir ja die .gz dateien in einem rutsch, ich bekomm aber nur den inhalt der ersten datei!

        @mimomamu:

        was überschreibe ich mit file_put_contents? ... wenn die dateien schon erzeugt wurden, dann werden sie doch nur noch geladen.

        Ich habe es grad versucht den inhalt in einer Variable zu speichern, jedoch bekomm ich weiterhin nur den Inhalt der ersten Datei und wie gesagt er läuft aber 2 mal durch, deshalb bin ich grad ziemlich verwirrt warum es nicht funktioniert.
        Mit dem Header
        PHP-Code:
        header('Content-Length: ' strlen($sContent)); 
        hat es leider auch nicht funktionert.
        Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
        Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.

        Kommentar


        • #5
          Zitat von mimomamu Beitrag anzeigen
          Accept-Encoding ist ein Request-Header. Er ist nur für Anfragen gedacht (also für die Nachrichten, die der Client an den Server sendet), nicht für Antworten (die der Server an den Client sendet).
          Dann wäre für die Response ein

          Content-Encoding: gzip

          Header angebracht wnéen er es unbedingt komprimiert senden will.

          Natürlich nur wnen im Request Header gzip unter Accept-Encoding geliustet ist.
          "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

          Kommentar


          • #6
            Was hindert dich eigentlich daran, das einfach per .htaccess zu machen?
            Code:
            AddOutputFilterByType DEFLATE text/css
            Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

            Kommentar


            • #7
              Zitat von Codercrush Beitrag anzeigen
              was überschreibe ich mit file_put_contents?
              Ich habe mal die unwichtigen Teile aus deinem Code gelöscht. Dann sieht dein Code ungefähr so aus:
              PHP-Code:
              for ($i 0$i count($aFiles); $i++)
              {
                
              $sFile $aFiles[$i];
                
              $sCssFile $sFile .'.css'
                
              $sGzFile  'gz/'$sFile .'.css.gz';

                
              // ...

                
              $sContent file_get_contents($sCssFile); 

                
              // ...

                
              $sContent gzencode($sContent6); 

                
              // Folgende Anweisung überschreibt die komprimierte Variante
                // von $aFiles[$i-1] mit der komprimierten Variante von $aFiles[$i].
                
              file_put_contents($sGzFile$sContent);


                
              // ...

              Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

              Kommentar


              • #8
                @mimomamu:

                Ich versteh noch nich so richtig was zu meinst.
                PHP-Code:
                // Komprimierte Datei vorhanden und noch aktuell?
                            
                if (file_exists($sGzFile) AND
                                (
                filemtime($sGzFile) >= filemtime($sCssFile)))
                            {
                                
                // Komprimierte Datei laden
                                
                $sContent file_get_contents($sGzFile);
                            }
                            else
                            {
                                
                // weitere Code ...
                                
                                // In Datei schreiben
                                //file_put_contents($sGzFile, $sContent);
                                
                                
                $bNew false;
                            } 
                Ich prüfe doch ob die datei existiert und ob sie noch aktuelle ist. Deshalb springt er da ja nicht mehr rein, denn die komprimierten Dateien existieren ja schon und werden dann nur noch eingebunden.

                Oder versteh ich dich jetzt irgendwie komplett falsch?^^
                Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
                Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.

                Kommentar


                • #9
                  Hast recht, war falsch was ich erzählt habe. Ich weiß halt nicht so ganz, was ich mit dem Satz
                  Das Problem ist nun das bei dem Codec mit gzip anscheinend nur einmal eine ausgabe erzeugt werden kann.
                  anfangen soll. Vielleicht wäre eine chronologische Auflistung der Schritte, die notwendig sind um aus Benutzeresicht den Fehler zu reproduzieren hilfreich.
                  Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

                  Kommentar


                  • #10
                    @Codercrush hast du meinen Kommentar überhaupt gelesen? Warum machst du das nicht per .htaccess? Das ist unkomplizierter und performanter.
                    Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

                    Kommentar


                    • #11
                      @Manko10:

                      Ich wollte es halt nur einmal komprimieren und dann immer laden. Bist du dir sicher das dass mit der .htaccess Datei performanter ist? ... wenn ja dann kann ich ja das skript was ich geschrieben habe komplett weglassen oder?
                      Ich würde so gern die Welt verändern doch Gott gibt mir den Quellcode nicht.
                      Compiler sind wie Franzosen.. schnauzen einen immer nur an, wenn man ihre Sprache nich perfekt spricht.

                      Kommentar


                      • #12
                        Jap.
                        Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

                        Kommentar

                        Lädt...
                        X