Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Caching, wie realisiert? (https://boardunity.de/caching-realisiert-t1643.html)

MrNase 31.03.2004 19:03

Caching, wie realisiert?
 
Hi,

nehmen wir eine Forensoftware. Wie wird da das Caching realisiert und was versteht man darunter genau?

Beim vB3 finde ich z.B. cache_templates(); oder cache_permissions();

Am liebsten wäre mir ne kurze Erklärung von euch und ein Link zu einer ausführlichen Beschreibung ;)

MrNase 31.03.2004 19:20

Meine Frage war für mich sehr deutlich:

Wie wird da das Caching realisiert und was versteht man darunter genau?

Es soll ja sicherlich nicht bedeuten, dass häufig verwendetes in eine txt-Datei gelagert wird ;)

Patrick Gotthardt 31.03.2004 19:21

Templates hatten wir hier vor kurzem:
http://www.boardunity.de/showthread.php?t=1463
Das compilierte Template wird als *.php gespeichert und dann eingebunden. Wie kommt auf deine Template-Klasse ein. Denkbar wäre z.B. ein einfaches include.

Das vorparsen von Beiträgen finde ich persönlich nicht so gut. Ist sehr umständlich, wenn man öfter mal einen neuen BBCode hinzufügt, oder entfernt oder ändert.

naggeldak 31.03.2004 21:54

Mal kurz und knapp, ich hoffe aber trotzdem einigermaßen verständlich (das folgende bezieht sich auf mein nBB, lässt sich aber bestimmt auch auf andere Forensystem übertragen):

Caching bei Templates:
In Templates stehen Dinge wie:
Code:

{if logged_in()}
    Hallo {$this_user['name']}
  {else}
    Hallo Gast
  {/if}

Dies wandelt der Parser um in:
PHP-Code:

if (logged_in()) {
    echo 
'Hallo '.$this_user['name'];
  } else {
    echo 
'Hallo Gast';
  } 

Templates wie thread_postbit (die in einem Thema dargestellten Beiträge) werden auf einer Seite mehrmals ausgegeben. Damit der Parser nicht jedes mal den nBB-Template-Code in php-Code umwandeln muss, wird der einmal erstellte php-Code in einer Variable zwischengespeichert und steht wird bei allen folgenden Aufrufen schon "kompilliert" zur Verfügung.
Alternativ ist es auch möglich, die Templates einmalig zu php-Code zu kompillieren und in eine Datei zu schreiben, sodass die Templates bei keinem Seitenaufruf kompilliert werden müssen.

Caching von Benutzerrechten:
Beim Aufrufen eines Themas wird vieles überprüft:

  • Hat der Benutzer Rechte, das Board zu betreten?
  • Hat die Gruppe des Benutzers Rechte, das Board zu betreten?
  • Hat der Benutzer Rechte, das Forum zu betreten?
  • Hat die Gruppe des Benutzers Rechte, das Forum zu betreten?
  • Hat der Benutzer Rechte, das Thema zu öffnen?
  • Hat die Gruppe des Benutzers Rechte, das Thema zu öffnen?
Damit nun nicht jedes mal eine Datenbankabfrage ausgeführt wird (in diesem Fall sechs Stück), wird zu Beginn jedes Aufrufs alles in ein Array gespeichert (folgende Darstellung ist lediglich exemplarisch):
PHP-Code:

$this_user = array(
    
'can_see_board' => true,
    
'can_see_forum' => array(
      
=> true,
      
=> true,
      
=> false
    
),
  ); 

Diese Variable wird nun für alle folgenden Überprüfungen von Benutzerrechten benutzt.

Caching bei Smilies und BB-Codes:
Ein Thema besteht aus mehreren Beiträgen, und jeder Beitrag muss auf Smilies und BB-Codes überprüft und ggf. umgewandelt werden. Damit nun nicht für jeden Beitrag zwei Datenbankabfragen ausgeführt werden müssen, geschieht dies nur beim ersten Beitrag. Dort werden Smilies und BB-Codes ausgelesen und in einem Array zwischengespeichert. Bei allen weiteren Beiträgen werden nun nicht mehr die Smilies und die BB-Codes aus der Datenbank gelesen, sondern die Werte aus dem Array genommen, was bei 20 Beiträgen (20-1)*2 = 38 Datenbankabfragen spart.

Ich hoffe, dass das so verständlich war, für nähere Details einfach in den Quellcode gucken. Ich denke aber, dass das hier schonmal ein guter Einblick in verschiedene Arten des Cachings war.

MrNase 31.03.2004 22:00

Hey Hendrik,

danke, auf so eine Antwort hatte ich gewartet :)
Trotzdem nehme ich dein Angebot gerne an und schaue mir den Quelltext deines Forums an. Da kann ich sicherlich noch was lernen ;)

grüße,

Björn 01.04.2004 01:24

Zitat:

Ein Thema besteht aus mehreren Beiträgen, und jeder Beitrag muss auf Smilies und BB-Codes überprüft und ggf. umgewandelt werden. Damit nun nicht für jeden Beitrag zwei Datenbankabfragen ausgeführt werden müssen, geschieht dies nur beim ersten Beitrag. Dort werden Smilies und BB-Codes ausgelesen und in einem Array zwischengespeichert. Bei allen weiteren Beiträgen werden nun nicht mehr die Smilies und die BB-Codes aus der Datenbank gelesen, sondern die Werte aus dem Array genommen, was bei 20 Beiträgen (20-1)*2 = 38 Datenbankabfragen spart.
naja das ist ja nur indirekt caching..
ich würde darunter zb verstehen, dass man den search - replace teil bei den smilies und bb codes in einer datei speichert, welche sich nur ändert, wenn man die bb codes abändert. so hab ich das bei mir realisiert.
sind zwar insgesamt nur 2 querys pro thread seite aber immerhin!
mfg

TRS 01.04.2004 10:52

Es gibt viele Arten von Caching. Die BBCodes können auch direkt in HTML umgewandelt und gespeichert werden. Bei Bedarf kann dieser wieder umgewandelt werden.

Eine andere Möglichkeit ist, welche nur in wenigne Fällen auf Foren zutrifft, die Speicherung des kompletten HTML Codes. Wenn eine Änderung auftritt oder wenn ein bestimmter Zeitraum abgelaufen werden, wird dann der Quelltext erneut frisch erstellt, sonst aus der Datei/Datenbank ausgelesen.

itst 01.04.2004 12:15

Schau Dir doch mal die template-cache*.php aus dem /contrib-Ordner von phpBB 2.0.x an. Es gibt je eine Template-Klasse für das Cachen über Dateien und die Datenbank.

phpBB 2.2 geht noch einen Schritt weiter und cacht auch Dinge wie allgemeine Einstellungen, Benutzereinstellungen, Rechte, ... Schau einfach in den Source.

Off-Topic:
Ist Open Source nicht toll ;)

Fabchan 17.04.2004 14:07

Caching innerhalb eines Seitenaufrufes wie weiter oben bereits ausführlich beschrieben, empfinde ich persönlich als selbstverstänlich. Wer bei jedem Beitrag innerhalb eines Threads jedesmal Smilies o.ä. abfragt, der hat in meinen Augen nicht allzu viel Ahnung von PHP und Co.

Ein gutes Beispiel für Caching ist auch das Tritanium Bulletin Board 1.x, welches Daten in Dateien speichert. Hier kann es in bestimmten Situationen vorkommen, dass eine Datei innerhalb eines PHP-Scripts des öfteren aufgrufen werden muss (mir fällt gerade kein Beispiel ein!). Jedes Mal, wenn der Inhalt dieser Datei ausgelesen werden müsste, prüft das Script, ob er bereits in einem assoziativem Array, welches als Schlüssel en Namen der Datei hat, gespeichert ist. nur falls dem nicht so ist, wird die Datei geladen.

Ich selbst verwenden zum Cachen von Datenbankinhalten, etc. in Dateien den PHP-Befehl serialize(). So kann ich die Daten (meisten Arrays oder Strings) exact so, wie sie in PHP waren, in Dateien cachen und kriege sie genauso wieder zurück, ohne implode(), explode() oder ähnliche Funktionen!

R. U. Serious 03.05.2004 13:23

Cachen kann man auf sehr, sehr vielen unterschiedlichen Ebenen. Als Einstieg empfehle ich diese Präsentation von Ulf Wendel: http://caching.ulf-wendel.de/

Wichtig ist immer den Flaschenhals zu erkennen, und dort mit dem Caching anzusetzen. Und wie so oft ist es besser man misst nach (bspw. mit XDebug für php, oder mit apache bench für generelle Zugriffszeiten, usw.), anstatt dass man nach intuitiven Vermutungen an den falschen Stellen optimiert...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25