Kai345: Ressourcen zusammenfassen

[latex]Mae  govannen![/latex]

Da mir die ewige copy&paste-Orgie der häufig benötigten Javascript-Funktionen pro Projekt auf den Geist geht (und nebenbei für einen gewaltigen Verwaltungsaufwand sorgt, falls sich eine dieser Funktionen ändert/verbessert wird)  habe ich vor, jede Funktion bzw. Funktionsgruppe als gesonderte Ressource auf dem Server abzulegen. Nun ist es natürlich unsinnig, diese Ressourcen einzeln per HTTP abzurufen, daher muß ich serverseitig mit PHP irgendwie alle benötigten Ressourcen zu einer  Resultierenden zusammenfügen und diese dann ausliefern. Gedacht habe ich mir das in etwa folgendermaßen:

  • PHP liest eine Konfigurations-Datei (text, csv, ini, xml ... Format erst mal nebensächlich) ein, in der die jeweils benötigten Ressourcen notiert sind (Alternativ: Verzicht auf Konfiguration und Notation direkt im PHP-Code)

  • Der Inhalt jeder Einzel-Ressource wird eingelesen und in ein Array geschrieben

  • sind alle Ressourcen eingelesen, wird das Array implodiert und in die auszuliefernde Ressource geschrieben.

Bis hierher schwere Fehler/Verbesserungen/Anmerkungen?

Nun zum eigentlichen "Problem":

Ich frage mich (und erhalte keine Antwort), ob es sinnvoll ist, diese Ressource jedes Mal neu zusammenbauen zu lassen, oder eine Routine einzubauen, die für jede einzelne Ressource prüft, ob diese aktueller ist als die erzeugte Ausliefer-Ressource. (filemtime).

Nur: Wie sehr belastet das Auslesen dieser Information den Server? Habe ich durch Einlesen, Vergleich usw. dann überhaupt noch einen Vorteil? Genauer gefragt (das geht in den Bereich Datei-System, wovon ich keine Ahnung habe daher meine dumme Frage) muß der Server jede Datei abklappern und die letzte Änderung erfragen oder ist das zentral im Datei-System abgelegt?

Cü,

Kai

--
Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
  1. Hallo Kai,

    Da mir die ewige copy&paste-Orgie der häufig benötigten Javascript-Funktionen pro Projekt auf den Geist geht (und nebenbei für einen gewaltigen Verwaltungsaufwand sorgt, falls sich eine dieser Funktionen ändert/verbessert wird)  habe ich vor, jede Funktion bzw. Funktionsgruppe als gesonderte Ressource auf dem Server abzulegen.

    wie häufig kommen solche Änderungen vor?

    • PHP liest eine Konfigurations-Datei (text, csv, ini, xml ... Format erst mal nebensächlich) ein, in der die jeweils benötigten Ressourcen notiert sind (Alternativ: Verzicht auf Konfiguration und Notation direkt im PHP-Code)

    Die Alternative ist keine, Stichwort "Wartbarkeit".

    Nun zum eigentlichen "Problem":

    Ich frage mich (und erhalte keine Antwort), ob es sinnvoll ist, diese Ressource jedes Mal neu zusammenbauen zu lassen,

    hört sich nicht sinnvoll an. Wegen einer Aktualisierung pro Woche (selbst pro Tag) stets dynamisch die Ressource zu erzeugen.

    oder eine Routine einzubauen, die für jede einzelne Ressource prüft, ob diese aktueller ist als die erzeugte Ausliefer-Ressource. (filemtime).

    oder einen anderen Ansatz zu wählen.

    Nur: Wie sehr belastet das Auslesen dieser Information den Server? Habe ich durch Einlesen, Vergleich usw. dann überhaupt noch einen Vorteil? Genauer gefragt (das geht in den Bereich Datei-System, wovon ich keine Ahnung habe daher meine dumme Frage) muß der Server jede Datei abklappern

    nein, das entsprechende Verzeichnis. Ja, es wäre eine verflixt gute Idee, diese Dateien in einer sehr flachen Verzeichnishierarchie mit wenigen Verzeichnissen zu haben.

    Denke daran, dass Dir kein clientseitiges Caching einen Strich durch die Rechnung machen darf, am einfachsten geht dies mit der Aktualisierung des Namens, zum Beispiel gleichbleibendes Präfix plus Timestamp. Bei gleichbleibender Ressource sollte der Client jedoch vom Caching profitieren - und Deinen Server entlasten.

    Daher schlage ich Dir vor, auf den Upload einer aktualisierten Ausgangsdatei zu reagieren. Danach prüft Dein Skript, welche Ressourcen (gemäß Konfiguration) neu zu erzeugen sind und erzeugt genau diese mit dem aktualisierten Namen. Möglichkeiten, das Skript anzustoßen, wären

    a) inotify [1], falls es Dir auf Linux-Systemen zur Verfügung steht
       b) Aktualisierung nur über ein Uploadskript
       c) Ausführen eines cron-jobs
       d) Manuelles Anstoßen durch Dich

    Freundliche Grüße

    Vinzenz

    [1] inzwischen sehe ich ein, dass der Einsatz sinnvoll sein kann.

    1. [latex]Mae  govannen![/latex]

      Da mir die ewige copy&paste-Orgie der häufig benötigten Javascript-Funktionen pro Projekt auf den Geist geht (und nebenbei für einen gewaltigen Verwaltungsaufwand sorgt, falls sich eine dieser Funktionen ändert/verbessert wird)  habe ich vor, jede Funktion bzw. Funktionsgruppe als gesonderte Ressource auf dem Server abzulegen.

      wie häufig kommen solche Änderungen vor?

      Irgendwo im Bereich mehrmals täglich bis alle 2 Jahre :D

      • PHP liest eine Konfigurations-Datei (text, csv, ini, xml ... Format erst mal nebensächlich) ein, in der die jeweils benötigten Ressourcen notiert sind (Alternativ: Verzicht auf Konfiguration und Notation direkt im PHP-Code)

      Die Alternative ist keine, Stichwort "Wartbarkeit".

      ?
      Irgendwo muß ich doch festlegen, welche der vielen Ressourcen für das jeweilige Projekt benötigt und eingebunden werden müssen, oder verstehe ich dich mis(s|t)?

      Daher schlage ich Dir vor, auf den Upload einer aktualisierten Ausgangsdatei zu reagieren. Danach prüft Dein Skript, welche Ressourcen (gemäß Konfiguration) neu zu erzeugen sind und erzeugt genau diese mit dem aktualisierten Namen. Möglichkeiten, das Skript anzustoßen, wären

      a) inotify [1], falls es Dir auf Linux-Systemen zur Verfügung steht
         b) Aktualisierung nur über ein Uploadskript
         c) Ausführen eines cron-jobs
         d) Manuelles Anstoßen durch Dich

      Wenn ich recht darüber nachdenke, fällt mir auf, daß es vollkommen ausreicht, wenn dieser Zusammenbau hier auf meinem lokalen Server stattfindet und ich nur die fertige Datei hochlade. Damit wäre es eigentlich auch egal, ob der hiesige Server etwas Arbeit hat oder nicht.

      Cü,

      Kai

      --
      Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
      selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
      1. Hallo,

        • PHP liest eine Konfigurations-Datei (text, csv, ini, xml ... Format erst mal nebensächlich) ein, in der die jeweils benötigten Ressourcen notiert sind (Alternativ: Verzicht auf Konfiguration und Notation direkt im PHP-Code)

        Die Alternative ist keine, Stichwort "Wartbarkeit".

        Irgendwo muß ich doch festlegen, welche der vielen Ressourcen für das jeweilige Projekt benötigt und eingebunden werden müssen, oder verstehe ich dich mis(s|t)?

        vermutlich. Ich meine:

        • PHP liest eine Konfigurations-Datei (text, csv, ini, xml ... Format erst mal nebensächlich) ein, in der die jeweils benötigten Ressourcen notiert sind

        mir erscheint es hier sinnvoll, die Konfiguration des Projektes auf eine solche Art und Weise vorzunehmen (und auch zu dokumentieren).

        (Alternativ: Verzicht auf Konfiguration und Notation direkt im PHP-Code)

        Den Verzicht auf die Konfiguration halte ich für nicht sinnvoll.

        "Oh, ein neuer Seitentyp! Ich muss mein Script anpassen ..."

        Freundliche Grüße

        Vinzenz

  2. Moin.

    Ich würde vorschlagen, die Datei auf deiner Entwicklungsmaschine manuell per Batch-Datei bzw. Shellskript zu erzeugen.

    Unter Windows z.B. so:

    del complete.js
        type *.js > complete._js
        move complete._js complete.js

    Eine noch komfortablere Lösung könntest du eventuell mit Makefiles erreichen.

    Christoph

    1. Hallo,

      Unter Windows z.B. so:
          del complete.js
          type *.js > complete._js
          move complete._js complete.js

      warum so umständlich? Dann hättest du außerdem immer eine Zeile mit dem Dateinamen zwischen den einzelnen Teilen.
      Ein einfaches

      copy *.js ../complete.js

      tut's doch auch. Achtung: Wenn die Zieldatei im gleichen Verzeichnis lieft wie die Quelldateien, gibt's Müll!

      Eine noch komfortablere Lösung könntest du eventuell mit Makefiles erreichen.

      Das wäre ja noch komplizierter. ;-)

      Ciao,
       Martin

      --
      Wer schläft, sündigt nicht.
      Wer vorher sündigt, schläft besser.
      1. Moin.

        Dann hättest du außerdem immer eine Zeile mit dem Dateinamen zwischen den einzelnen Teilen.

        Nö. der Dateiname bleibt im Konsolenfenster.

        Achtung: Wenn die Zieldatei im gleichen Verzeichnis lieft wie die Quelldateien, gibt's Müll!

        Daher das del und move in meiner Version - damit die Ausgabedatei eben anfangs nicht auf '.js' endet.

        Eine noch komfortablere Lösung könntest du eventuell mit Makefiles erreichen.

        Das wäre ja noch komplizierter. ;-)

        Nö, gar nicht. Vor allem, falls mal aus mehreren Skripten unterschiedliche Skripte in unterschiedlichen Verzeichnissen generiert werden sollen.

        Ein einfaches make erstellt dann nur die Dateien neu, die tatsächlich neu erstellt werden müssen.

        Die wildcards sind natürlich ein bisschen umständlicher, aber das ist auch alles machbar, z.B. so:

        get_scripts = $(wildcard $(1)/*.js)
            scripts := $(call get_scripts,./path/to/scripts)

        Nema Problema.

        Christoph

        1. Moin.

          Nochmal ich.

          Eine noch komfortablere Lösung könntest du eventuell mit Makefiles erreichen.

          Das wäre ja noch komplizierter. ;-)

          In einem anderen Thread habe ich übrigens vor nicht ganz zwei Stunden auch eine Lösung per XMLHttpRequest vorgestellt.

          Das funktioniert in gängigen Browsern auch ohne Server aus dem Dateisystem. Und es benutzt JavaScript. Sicherlich *viel* einfacher als diese ach-so-komplizierten Makefiles ;)

          Christoph

  3. Guten Tag,

    Nur: Wie sehr belastet das Auslesen dieser Information den Server? Habe ich
    durch Einlesen, Vergleich usw. dann überhaupt noch einen Vorteil? Genauer
    gefragt (das geht in den Bereich Datei-System, wovon ich keine Ahnung habe
    daher meine dumme Frage) muß der Server jede Datei abklappern und die
    letzte Änderung erfragen oder ist das zentral im Datei-System abgelegt?

    Du könntest einen Build-Prozess (mit make, Ant, Maven oder sonstwas) erstellen, der verschiedene Aufgaben übernimmt, z.B. den Upload der Dateien oder eben auch das Zusammenfassen von Dateien.

    Gruß
    Christoph Jeschke

    --
    Zend Certified Engineer
    Certified Urchin Admin