WauWau: Perfomance: großes Array vs. Db-Zugriff bei jedem Request

Hola,

ich bin mal wieder am Überlegen. Und dabei bin ich auf die Idee
gekommen, dass mein Projekt ganz schon groß werden könnte und ich
die Navigation gerne auf besserem Wege speichern würde. Momentan
wird die Navigation der ersten sowie zweiten Hierarchie nämlich
noch direkt in einem Template[1] gespeichert, die dritte "Hierarchie"
von einem Array dynamisch reingeladen[2].

Im Gesamtding also so, dass ein statisches normales Menü[1] da ist,
und dann ein "Submenu", dargestellt in [2].

Jetzt habe ich überlegt, ob ich das ganze nicht ein bisschen besser
regele. Denn z.B. habe ich vor, das ganze als Mehrdesign-Möglichkeit
zu machen, die evv. auf unterschiedlichen Templates beruht. Hier
müsste ich in jedem Template das Menü speichern, das ist sehr un-
günstig. Deswegen wollte ich das Menü in seinen (min.) 3 Hierarchien
in einer DB speichern, da ich sowieso MySQL für das Projekt nutze,
bietet es sich auch sehr gut an.

Nur komme ich letztenendes zum Schluss, dass es extrem Serverlastig
wird. Wegen jedem Request nämlich muss dann eine Verbindung zur DB
hergestellt werden (dann bekommt sie richtig viel zu tun ;), die
Daten gesammelt werden, das ganze ins Design eingebaut werden.

Eine andere Möglichkeit wäre es, das ganze in eienm Array in irgend-
einer Datei zu speichern[3]. Ob das wirklich besser ist?

Meine Frage ist: Wie machen CMS-Systemchen das eigentlich? Ich meine,
die arbeiten ja auch mit Templates, alle Inhalte sind in einer DB
gespeichert, ist das bei denen nicht wahnsinnig speicherlastig?

Gruß,
WauWau

---------------------------------------------------- Fußnoten

[1] Also z.B. sowas:
    <ul id="navigation">
      <li><a href="bla">Punkt1</a>
          <ul>
            <li><a href="blo">Untermenüpunkt1</a></li>
            ...
          </ul></li>
      ...
    </ul>

[2] Z.B.
function site_navigation_specialmenu($menuid)
{
  $saved = array();

$saved[1] = array(); // saved[0] nicht benutzt.
    $saved[1][0] = 'Portal';
    $saved[1][1] = '<li><a href="/?sitemap">Sitemap</a></li><li><a href="/news/">News</a></li><li><a href="/news/admin/">News Administration</a></li>';
  $saved[2] = array();
    $saved[2][0] = 'Überschrift';
    $saved[2][1] = '<li>Listenpunkte</li><li>...</li>';
 ....
}

[3] dann eben z.B.

menu = array(
  array("Beschriftung", "URI",
     array(
        array("untermenunkt", "URI"),
        array("untermenüpunkt2", "URI)
     ),
  array("Punkt 2", "URI")
);

...

--
ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
Self ist der WauWau
  1. Hallo WauWau,

    Wegen jedem Request nämlich muss dann eine Verbindung zur DB
    hergestellt werden (dann bekommt sie richtig viel zu tun ;), die
    Daten gesammelt werden, das ganze ins Design eingebaut werden.

    Eine andere Möglichkeit wäre es, das ganze in eienm Array in irgend-
    einer Datei zu speichern[3]. Ob das wirklich besser ist?

    Also, ohne mir jetzt die Struktur deines Systems genauer angeschaut zu haben (ist mir zu viel um diese Uhrzeit ;), kann ich dir folgende Erfahrungswerte liefern. Gesammelt habe ich diese Erfahrungen einmal auf meinen lokalen Rechner sowie auf einem Server bei einem großen Provider. Mit leichten Abweichungen waren die Ergebnisse aber identisch:

    1. Speichern in PHP-Variablen ist schneller als DB-Zugriff (MySQL)
    2. Speichern in DB ist schneller als Dateizugriff

    Ich habe für ein Projekt (Authoring-SW) getestet, den Inhalt von ca. 1.000 Menüpunkten auf alle drei Arten zu speichern und wieder aufzurufen.

    Man könnte jetzt meinen, am besten alles in PHP-Variablen/Arrays speichern, das würde ich aber nicht tun.
    Denn neben der reinen Geschwindigkeit kommen ja auch noch andere Überlegungen zum tragen, wie z.B. Übersichtlichkeit der Programmierung, Aufwand für nachträgliche Änderungen, etc.

    Ich selbst mache bei meinen Projekten i.d.R. folgendes:

    • alle statischen Werte, die sich selten oder nie ändern (Einstellungen etc.) speichere ich in PHP-Variablen.
    • alle Inhalte, die sich öfter mal ändern und/oder bei denen es auf komplexe Abfragemöglichkeiten ankommt gehen in eine SQL-DB. Dazu gehört meistens auch die Menüstruktur (bei strukturierten Systemen, nicht bei einfachen Webseiten).
    • Speicherung von Daten in Dateien nehme ich immer dann vor, wenn die Daten auch ohne das System lesbar sein sollen (z.B. Logdaten).

    Gruß, André

    1. Hallo André,

      1. Speichern in PHP-Variablen ist schneller als DB-Zugriff (MySQL)

      das kann ich mir gut vorstellen ;-)

      1. Speichern in DB ist schneller als Dateizugriff

      Echt? Kann denn PHP schneller eine Verbindung zur lokalen DB herstellen, als eine Datei zu öffnen? Gut zu wissen :)

      Ich habe für ein Projekt (Authoring-SW) getestet, den Inhalt von ca. 1.000 Menüpunkten auf alle drei Arten zu speichern und wieder aufzurufen.

      Viel Arbeit für einen kleinen Test ;)

      Man könnte jetzt meinen, am besten alles in PHP-Variablen/Arrays speichern, das würde ich aber nicht tun.
      Denn neben der reinen Geschwindigkeit kommen ja auch noch andere Überlegungen zum tragen, wie z.B. Übersichtlichkeit der Programmierung, Aufwand für nachträgliche Änderungen, etc.

      Ja, eigentlich schon. Man könnte es aber auch in einer "externen" PHP-Datei niederschreiben (das array) und dann includen. Aber ich denke, DB wäre hier auf jeden Fall besser, eigentlich schon, ja.

      Ich selbst mache bei meinen Projekten i.d.R. folgendes:

      • alle statischen Werte, die sich selten oder nie ändern (Einstellungen etc.) speichere ich in PHP-Variablen.

      Wann ist schon mal etwas statisch ;-) - bei mir ist alles dynamisch ;-)

      neinnein ;)

      • alle Inhalte, die sich öfter mal ändern und/oder bei denen es auf komplexe Abfragemöglichkeiten ankommt gehen in eine SQL-DB. Dazu gehört meistens auch die Menüstruktur (bei strukturierten Systemen, nicht bei einfachen Webseiten).
      • Speicherung von Daten in Dateien nehme ich immer dann vor, wenn die Daten auch ohne das System lesbar sein sollen (z.B. Logdaten).

      Ist soweit auch ganz gut so :)

      Na gut, ich habe mir gestern auch nochmal Gedanken gemacht, und abgesehen von der Tatsache, dass bei jedem Request nun eine Verbindung zur DB aufgebaut werden muss, scheint mir das mit der DB auch am schönsten zu klingen :)

      WauWau

      --
      ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
      Self ist der WauWau