Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Konzept für einen kompletten dateibasierten Webseiten-Cache (https://www.delphipraxis.net/93564-konzept-fuer-einen-kompletten-dateibasierten-webseiten-cache.html)

Matze 7. Jun 2007 14:20


Konzept für einen kompletten dateibasierten Webseiten-Cache
 
Moin zusammen,

hin und wieder bin ich am Überlegen, ob ich den Inhalt meiner Webseite komplett in Dateien cachen sollte, Grund ist der, dass die Datenbank gelegentlich nicht erreichbar ist (dies liegt vorwiegend an enormen Spamwellen zur Zeit). Somit würde der Cache
  1. die Datenbank ein klein wenig entlasten (vernachlässigbar)
  2. dafür sorgen, dass die Seite auch weiterhin erreichbar ist, auch wenn die Datenbank dies nicht sein sollte
Ich bin momentan zeitlich sehr eingespannt, aber möchte dennoch mal grob einen Entwurf haben, wie so etwas aussehen könnte oder ob ich's gleich bleiben lassen sollte.

Ich sehe folgende Hürden bei diesem Vorhaben:
  1. Dynamischer Seiteninhalt führt zu einem großen Cache (Webspace habe ich jedoch momentan noch genügend)
  2. Daten, wie die aktiven Sitzungen, Statistiken etc. müssten vor bei einem Datenbankausfall in Dateien ausgelagert und bei einer erneuten erfolgreichen Verbindung zur Datenbank in diese übertragen werden.
In letzterem sehe ich das Hauptproblem des ganzen.

Den Bloginhalt könnte ich in einer überschaubaren Ordnerstruktur verwalten, was kein Problem sein sollte, zumindest nicht das Speichern. Doch lese ich beispielsweise aus der Datenbank die Anzahl aller Blogeinträge aus, um die Seitenzahlen zu berechnen. Das ohne Datenbank zu bewerkstelligen könnte schwer werden, da die Abfragen mit Filtern und ähnlichem mit der Datenbank sehr einfach gehen und ohne weiß ich gar nicht, wie man das macht. Evtl. die Ergebnisse der getätigten Abfragen speichern (Arrays extern zu cachen stellt für mich kein Problem dar), denn diese ändern sich ja nicht allzu häufig (bis auf die Statistik und Sitzung-Geschichte).

Ich persönlich würde fast sagen, es ist mit vertretbarem Aufwand nicht möglich, auf die Datenbank zu verzichten, doch vielleicht könnte ihr mir ein paar Tipps geben. Mir ist das auch nicht sonderlich wichtig, es wäre aber ein nettes Feature.


Sommerliche Grüße wünscht
Matze

mkinzler 7. Jun 2007 14:26

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Auf welche Technik basiert deine Seite für php gibt es ja verschiedene Lösungen für diese Problem:

http://pecl.php.net/package/apc
http://turck-mmcache.sourceforge.net/index_old.html

Matze 7. Jun 2007 14:31

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Hallo Markus,

was du verlinkt hast, cacht lediglich ausgewerteten PHP-Code und das benötige ich nicht. Welche Technik ich nutze, kann ich dir nicht sagen, eben eine kleine Template-Klasse, ähm jo, normales PHP (kompatibel zur Version 4) eben. :gruebel:

Arrays, dessen Inhalte aus der Datenbank kommen, cache ich bereits in Dateien (Konfiguration und ähnliches, was sich kaum ändert). Ich denke, über intelligentes Cachen der Ausgelesenen Daten (das sind dann im Prinzip Arrays) und Auswerten derselben lässt sich das irgendwie realisieren.

f.siebler 7. Jun 2007 14:35

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
hi,

also es gibt die möglichkeit den output in eine variable zu schreiben, diesen inhalt dann in einer datei ablegen und gut ist... und das ganze mit einem timestamp versehen, und regelmäßig ersetzten... eigentlich ganz einfach, geht am besten mit einer include datei die direkt als erstes eingebunden wird...

mkinzler 7. Jun 2007 14:36

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Mit Technik meine ich PHP/ASP/ASP.Net...
PHP-Caches cachen ja ganze Seiten, so daß wenn die selbe Anfrage kommt diese aus dem Cache beantwortet wird.

Matze 7. Jun 2007 14:39

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Hallo

Zitat:

Zitat von f.siebler
also es gibt die möglichkeit den output in eine variable zu schreiben, diesen inhalt dann in einer datei ablegen und gut ist... und das ganze mit einem timestamp versehen, und regelmäßig ersetzten... eigentlich ganz einfach, geht am besten mit einer include datei die direkt als erstes eingebunden wird...

Ich habe eine Klasse, die genau auf diesem Wege Arrays cacht, das ist also kein Problem.

Zitat:

Zitat von mkinzler
PHP-Caches cachen ja ganze Seiten, so daß wenn die selbe Anfrage kommt diese aus dem Cache beantwortet wird.

Ok, aber das wäre in der Art auch kein Problem, doch muss ich die Sitzungen irgendwie verwalten können. Man sollte sich auch in der Zeit anmelden und loskommentieren können. Schön wäre es auch, wenn die Daten für die Statistik (User-Agent & Co) nicht verloren gehen.

DGL-luke 7. Jun 2007 14:48

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Hallo,

dann ist das, was du willst, doch ein ersatz für die mysql-datenbank.

ich würd dafür am besten eine sqllite-db vorhalten, mit allem, was du brauchst, wenn die db grad nciht da ist - userdaten etc.
du brauchst in deinem source dann immer einen fallback - für anmeldung, für comments, etc.
Neuer content wird dann zwischengespeichert bis die db wieder "da" ist.

und halt n statischen cache, der solange die db da ist, immer mit jeder änderung der seite (die du als admin ja immer anstößt bzw. ein user der kommentiert o.ä.) aktualisiert wird.

himitsu 7. Jun 2007 14:58

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
wenn aber eh alles aus der DB in der Cache ebenfalls drin wäre,
warum dann nicht gleich auf MySQL verzichten?

es gibt ja Dateibasierende Datenbanken ... die geringste Aufwand wäre dann der, daß einfach die MySQL-Anfragen an die Text-DB umgeleitet werden würden.

Matze 7. Jun 2007 15:03

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Moin,

also eine zweite Datenbank möchte ich beim besten Willen aber nicht einführen. :)

@himi: Ich denke das Auslesen aus der DB ist bei komplexeren Abfragen deutlich schneller, als Arrays auszuwerten. ich möchte daher nur den ganzen Inhalt aus der DB lesen, wenn diese nicht erreichbar ist.

DGL-luke 7. Jun 2007 15:20

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
...du kannst ja die komplette mysql-db auf eine dqllite-db mirrorn - aber eben immer nur schriebenderweise, und lesend erst dann, wenn die mysql-db schlappmacht.

Matze 7. Jun 2007 15:27

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Hm also das kommt mir ein wenig übertrieben für mein Vorhaben vor, zumal ich "nur" eine MySQL-DB besitze und mehr auch gar nicht verwenden möchte, sonst ist dies ja doppelter Wartungsaufwand. Ich möchte also definitiv bei einer einzigen MySQL-Datenbank bleiben.

himitsu 7. Jun 2007 15:30

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Zitat:

Zitat von Matze
Ich denke das Auslesen aus der DB ist bei komplexeren Abfragen deutlich schneller, als ...

hab ich ja nicht bestreitet :roll:

Zitat:

Zitat von Matze
ich möchte daher nur den ganzen Inhalt aus der DB lesen, wenn diese nicht erreichbar ist.

ja, aber wenn die DB nicht erreichbar ist, wie willst du dann deren Daten auslesen und zwischenspeichern?

ergo müßtest du ständig die ganzen Daten, für den Fall eines Ausfalls, in der Cache spiegeln,
wobei du dann ja eigentlich auch gleich nur den "Spiegel" (FileDB) führen und das "Original" (MySQL) weglasses könntest.

Matze 7. Jun 2007 15:34

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Ich würde die Dateien dann beim Seitenaufruf anlegen, sofern diese nicht vorhanden sind oder Änderungen durchgeführt wurden, wie ich es bisher auch mache. Dann ist im Falle eines Ausfalls das da, was nötig ist und kann von dort gelesen werden.

Mir kommt gerade, dass ich auch eine Funktion schreiben könnte, die ermittelt, ob die Datenbank erreichbar ist und wenn nicht, werden alle "aktiven" Seitenfunktionen deaktiviert. Dann kann man immer noch herumsurfen, nur eben nichts verfassen.

S2B 7. Jun 2007 15:42

Re: Konzept für einen kompletten dateibasierten Webseiten-Ca
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Matze
ich möchte daher nur den ganzen Inhalt aus der DB lesen, wenn diese nicht erreichbar ist.

ja, aber wenn die DB nicht erreichbar ist, wie willst du dann deren Daten auslesen und zwischenspeichern?

Ich denke, das war ein Tippfehler... :wink:

Zitat:

Zitat von himitsu
ergo müßtest du ständig die ganzen Daten, für den Fall eines Ausfalls, in der Cache spiegeln,
wobei du dann ja eigentlich auch gleich nur den "Spiegel" (FileDB) führen und das "Original" (MySQL) weglasses könntest.

Da ich ja Matzes Seite kenne, weiß ich, dass ungefähr die Hälfte der Seite aus einem Administrations-Bereich besteht. Wenn du jetzt die komplette Seite auf Dateien oder ein langsameres DB-System umstellen würdest, wären vielleicht die Ausgaben ähnlich leicht umzusetzen und auch ungefähr gleich schnell, jedoch würde es spätestens im Administrations-Bereich kompliziert werden (Einfügen oder Modifizieren von Daten in einem Datei-Cache ist nicht das gelbe vom Ei...).

Im Moment weiß ich ehrlich gesagt noch nicht so recht, was ich von so einer Idee halten soll. Ich denke, dass es schon ein großer Aufwand werden wird, wenn man das ganze immer manuell abfragt. Da die Seite ja ohne eine Datenbank-Klasse arbeitet, gibt es auch keine Stelle, an der man so einen Cache zentral einbauen könnte, weshalb man das ganze entweder immer manuell machen oder die Seite auf eine DB-Klasse umstellen müsste. So oder so also viel Arbeit...

Edit: Mist, da schreibt mich doch dieser Matze in ICQ an und sagt mir, dass er meine DB-Klasse verwenden würde. :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz