Script-Perfomance steigern mit Caching?

Manimal

Angesehenes Mitglied
Hallo Ayomer,

da mir das letzte mal so gut geholfen wurde nochmal eine Frage zur Optimimierung meiner Scripte.

Folgender Code wird in einem meiner Scripte bei JEDEM Besuch der Seite ausgeführt:
CODE
$count = @mysql_query("SELECT `id` FROM tabelle WHERE active='1'");


(Es gibt noch mehr solche Fälle, als Beispiel sollte sich diese Abfrage aber gut eignen...)

Nun stellt sich mir die Frage, kann ich das Ergebnis vll irgendwie zwischenspeichern?
Zumindestens macht es für mich aus rein logischer Sicht keinen Sinn diese Abfrage bei 1000 Besuchern immer wieder ausführen zu lassen obwohl ich genau weiß das diese sich nur sehr unregelmäßig (alle ca. 3-7 Tage) ändert.

Und bringt es überhaupt was das Ergebnis / die Ausgabe zu cachen, sprich kann damit die Perfomance gesteigert oder die Last verringert werden?

Danke vorab!
 
Hallo,

das Problem am Zwischenspeichern wird wohl sein, dass du stets aktuelle Werte angeben möchtest.
Wenn der Wert z.B. nur beim Betreten der Webseite einmal berechnet werden soll und dann fix bleibt, kannst du das beim ersten mal machen und den Wert in ne Sessionvariable speichern. Beim Aufruf einer Seite prüfst dann die Session, ob sie leer ist, ggf. füllst sie etc.

Gruß, Daniel
 
Hallo Daniel,

vielen Dank für die schnelle Antwort.

Leider ist es nicht ganz das was meiner Situation entspricht. Der Wert ist tagelang der selbe, egal für welchen Besucher.
Ein vereinfachtes Beispiel: "Es sind zur Zeit $count Rezepte online."
Wie gesagt solc ein Wert ändert sich nicht allzu schnell. Trotzdem wird die Abfrage für jeden Besucher, also mehr als 1000 mal am Tag ausgeführt. Meine erste Idee war diesen Satz in einer Datei auf dem Server zu cachen.

Bin mir aber nicht sicher wie ich das am effektivsten anstelle und ob das wirklich die Perfomance steigert oder die Last verringert...
 
counter.php:
<?php
$count = 120; //rezepte
?>

index.php:
<?php
include('counter.php');
if($rezept_jetzt_eintragen){
//update counter.php
}
?>
 
Ich weiß zwar nicht, wie das in PHP ist.

Aber bei server-daten und der zugrundeliegenden .NET-Architektur nutze ich Caching exzessiv.

So werden bsp. die Metadaten-Definitionen für die 16 internen Menüs (das sind Informationen zu etwas 60 Systemtabellen und etwa 450 Spalten) einmalig beim Start der Anwendung vom DbServer geholt und dann als NET-DataSet gecacht und von vielen Nutzern gemeinsam genutzt. Ebenso die Metadaten pro Tabelle pro Kundendatenbank, diese Infos können mehrere Nutzer dieser Kundendatenbank parallel nutzen.

Oder: Beim erstmaligen Laden einer Seite wird der Seitencode als XPath-Dokument gecacht, die Überprüfungen der Seitenberechtigungen sind pro Nutzer-Id gecacht. Hinzu kommen Sessionvariablen mit der letzten Suche und ähnliches. Oder ziemlich große Kalenderabfragen (mehrere Monate, einige Einträge pro Tag), die werden nur neu gestellt, wenn der Nutzer etwas ändert (die Seite erstmalig aufruft oder blättert).

Und manche dieser Dinge werden nicht in der Session, sondern global gecacht - das spart einfach einige Roundtrips.

Allerdings hat .NET auch ein ziemlich gutes Caching: Man kann bsp. festlegen, daß ein Eintrag 20 Minuten nach der letzten Verwendung automatisch verfällt oder daß er (wie oben die globalen Metadaten) niemals verfällt. Und bestimmte Informationen werden grundsätzlich mit einem 5-Minuten-Verfall gecacht - das genügt für 'einigermaßen aktuelle Werte' und erfordert bloß eine Abfrage alle 5 Minuten (bei Dauerverkehr).

PS: Dateicaching ist eigentlich nicht so effizient - das kann zu Problemen beim parallelen Zugriff führen. RO-Arbeitsspeicher-Caching ist sehr effizient.
 
Ich schreibe mir mit select erzeugte Tabellen in jeweils ein File und schreibe die dann einmal täglich auf den Server. (crontab)
Das Anzeigetemplate ruft die Tabelle dann über php include auf.
Funktioniert bestens
 
Wenn die Seiteninhalte selten wechseln und die Seiten nicht personalisiert sind kann sich der Einsatz eines reverse Proxy mit recht wenig Aufwand schnell brauchbare Resultate liefern. Dieser macht eigentlich nichts anderes als die ausgelieferten Seiten des Webservers zu cachen.
 
bau doch einfach ein, dass nachdem ein rezept hinzugefügt wurde, die stats.xml aktualisiert wird.
wink.gif
 
Der reverse Proxy wird einfach vor den Webserver geschalten. Je nach Ausprägung des Problems auf einem eigenen Server oder wenn es nicht so gravierend ist, auf dem Server wo der Webserver läuft selber. In dem Fall ist es aber notwendig, die Ports


Weitere Informationen finden sich bei Google oder dort zum Beispiel: http://www.tecchannel.de/server/linux/402455/
 
Ich cache generell so viel wie möglich, hab dafür eine feine Klasse in PHP die das ganze für mich regelt. Allerdings stellt sich bei einem einfachen SELECT COUNT-Query z.B. die Frage, ob es wirklich sinnvoll ist, da für einen Cache-Hit genauso eine Datei aufgerufen werden muss wie für die direkte SQL-Abfrage. RAM-Caching wäre da natürlich besser (kann meine Klasse auch), bringt aber den Nachteil, dass man bei PHP eine Erweiterung (wie z.B. memcached) braucht.
 
wie kann ich denn am einfachsten cachen?

Bitte um ein kurzes beispiel anhand einer sql Abfrage, welche aber nur sagen wir mal alle 4 Tage ausgeführt werden soll.

wie muss diese Abfrage aussehen, incl. Cache Ordner usw...

wäre für Hilfe sehr sehr dankbar!!
 
Zurück
Oben