[PHP] Pipeline-Datenstruktur

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

[PHP] Pipeline-Datenstruktur

Beitrag von Tejio »

Guten Abend!

ich bins wieder :) Die Webentwicklung geht weiter voran und ich bin beim Arbeiten an der Shell. Ich bin ein Fan der Bash-Shell und ein wichtiges Feature der Shell ist die Pipe. Nun hatte ich vor, meine Webseite generell nach MVC/MVP aufzuteilen mit der Verwendung einer einfachen Template-Engine. Damit die Webseite interaktiv und gestylt wird, müssen die benötigten Dateien in der Regel eine Reihe von Verarbeitungsschritten durchgehen.

Zum Beispiel Javascript:
jquery (90kb) + jquery-ui (206kb) + jquery-plugins (?kb)

Angenommen, ich brauche nur die ersten beiden genannten Dateien, dann komme ich auf 296kb. Nach der Komprimierung mit dem Php Packer reduziert sich das ganze auf 184kb, sprich knapp 40%. Mit einer Komprimierung mit gzcompress sinkt die Dateigröße auf 76kb.

Das gleiche mache ich mit den Stylesheets (reset.css + olive.css + navigation.css + layout3.css).

Lange Rede, kurzer Sinn: Ich hab die ganze Geschichte mit Pipes realisiert. Und ich wollte fragen, ob es an dieser Stelle übertrieben ist. Oder habt ihr einen Vorschlag, wie man sowas verbessern könnte?

Mein derzeitiger Stand:

Code: Alles auswählen

  $pipeline = new Pipeline();

  $pipeline
    ->input("jquery.js")
    ->input("jquery-ui.js")
  ;

  $pipeline
   /** Eingabedaten werden als Dateinamen betrachtet und die Inhalte dieser Dateien werden ausgegeben auf die nachfolgenden Pipes  */
    ->utilize(new ExpandToFileContent())
   /** Eingabedaten werden zu einem einzelnen Strom zusammengefasst  */
    ->utilize(new SingleInput())
   /** Eingabedaten werden mit dem PHP-Packer komprimiert  */
    ->utilize(new JavascriptCompressor())
   /** Allgemeine Stringkonvertierung mit gzcompress  */
    ->utilize(new StringConverter(gzcompress))
  ;

  /** Pipeline wird durchgelaufen  */
  $pipeline->start();

  /** Endergebnis der Pipeline */
  $result = $pipeline->output();

  if (!is_null($result) && is_array($result))
  {
    $writer = new Writer();
    $writer->write($result[0]);
  }
Zuletzt geändert von Tejio am 17.09.2011, 11:03, insgesamt 1-mal geändert.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [PHP] Pipeline-Datenstruktur

Beitrag von Chromanoid »

Die js Sachen ändern sich doch nie oder übersehe ich da gerade was :)? Wenn nicht, kannst du das ganze Zeug so vorbereiten, dass es schon komprimiert im Verzeichnis liegt. Und den Zip-Kram kannst du direkt in Apache (mod_deflate) machen.
Um Javascript Code zu optimieren kannst du dir auch mal http://code.google.com/p/closure-compiler/ anschauen. Nur wenn du vom Benutzer hochladbare Scripte benutzt (z.B. für ein CMS), brauchst du onDemand-JavaScript-Trimming und dann auch immer nur einmal pro generierter/hochgeladener Datei...
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [PHP] Pipeline-Datenstruktur

Beitrag von Aramis »

Ziemlich ungeeignet wenn du mich fragst, Kompilation statischer Daten sollte offline erfolgen. Wenn du die Funktionalitaet in ein PHP-Frontend einbettest, erhoeht sich nur die Komplexitaet von selbigem. Am Ende wirst du nur eine weitere Caching-Ebene einfuehren um den Effekt zu kompensieren.

Als Compiler zu empfehlen sind der bereits von Chromanoid erwaehnte Google-Closure-Compiler sowie der http://developer.yahoo.com/yui/compressor/.
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: [PHP] Pipeline-Datenstruktur

Beitrag von Tejio »

Danke euch beiden für eure Antworten!

bei statischen seiten habt ihr auch recht. Packing und Komprimierung der Dateien offline sollte ausreichen.

Aber wie schaut es aus mit dynamischen daten aus? Ich denke dabei an Content-Management-Systeme. Da werden auch die verschiedensten Javascript-Kombinationen miteinander verwendet.

Ich möchte nach Möglichkeit nur die notwendigen Javascript-Schnipsel komprimieren und an den Client senden. jQuery-UI ist ja ein großer Haufen, da es für alle möglichen Fälle Skripte enthält. Wäre es nicht besser, wenn man bei jedem Dokument erst mal guckt, welche Schnipsel es benötigt. Diese Schipsel werden dann gepackt, komprimiert und gecacht. Zu guter Letzt werden sie an den Client geschickt. Und wenn die Daten nochmal benötigt werden, guckt die Seite bloß, ob der Zeitstempel der abhängigen Code-Schnipsel aktueller ist als der Cache-Zeitstempel.

Der Google Closure Compiler hat gute Kompressionsergebnisse. Vielleicht habe ich ihn falsch aufgerufen, aber der Yahoo! YUI-Compressor schafft irgendwie nicht viel. Bei einem bereits komprimierten jQuery (90kb) kann er das Skript nur sehr gering komprimieren. Mit meinem PHP-Packer kriege ich um die 26kb weg.


Kann es sein, dass ich ein wenig mit der Komprimierung übertreibe? :oops:
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [PHP] Pipeline-Datenstruktur

Beitrag von Aramis »

jQuery/jQuery-UI kannst du auch gratis von Googles CDN (oder anderen Quellen) einbinden, dann faellt fuer dich kein Traffic an und der Client cached die Daten auch nicht mehrfach, wie es der Fall waere wenn jede Website ihre eigene Kopie auslieferte.

Ganz davon abgesehen dass deren Antwortzeiten vermutlich besser sind als deine.
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: [PHP] Pipeline-Datenstruktur

Beitrag von dronus »

Solange du wenig Besucher hast, freuen die sich über die schnelle Übertragung... dann finden sie es gut und werden viele, und sobald etwas Last auf deinem PHP ist warten alle auf deinen Komprimierer :-)
Ich schätze das sich der Aufwand nicht so lohnt, gerade weil der große Aufwand beim Script-Kompilieren wieder relativiert wird wenn ohnehin nochmal generell gepackt wird. Das must du mal testen. Es kann gut sein dass ein JS, dass durch JS strippen auf die Hälfte eingedampft wird (durch hohem codetechnischen Wahnsinn) nach dem gzip nicht viel kleiner ist als das gzippte Originalscript. Naja probieren geht über studieren... immerhin ist das Thema wieder aktueller durch Mobilsurfer in schlechtausgebauten Netzen...
Antworten