Caching

versuch13

Erfahrenes Mitglied
Hi, ich habe die Suche benutzt und auch schon mal ein wenig das Netz durchsucht
jedoch denke ich fehlt es mir an grundlegenden Informationen um mich überhaupt
richtig informieren zu können. Jetzt habe ich von Sachen wie output caching, server caching usw. gelesen. Die einfache Frage ist, wann benutze ich was, was lässt sich
am einfachsten realisieren. Ich stelle einfach mal ein paar weitere Fragen um ein paar
unterschiedliche Fälle zu beschreiben.

1. Am Beispiel eines Menüs welches aus einer Datenbank generiert wird, überhaupt cachen?- ich habe keine Ahnung.

2. Ein Blog, welche Methode würde sich hier anbieten, sagen wir es werden 3-4
Beiträge in der Woche verfasst.

3. Ein Forum wie dieses (o.ä.), also wirklich viele Änderungen alle paar Minuten.

4. Oder aber ein Firmen Portrait auf dem sich vielleicht einmal monatlich etwas ändert.

Das deckt ja jetzt schon mal einiges ab, wäre nett wenn das jemand kurz beantworten
könnte oder interessante Links zu dem Thema hätte.


So und noch ein paar kleine Fragen.

Was ist mit MySQL Query Cache, wann sollte man das nutzen?

Was wird alles gecached wenn ich einfach nur per header() ein expire Datum in der Zukunft angebe?


Ich bin froh und dankbar über jegliche Informationen rund um das Thema und generell
auch zum Thema Performance.


Vielen Dank schon mal.
 
1. Am Beispiel eines Menüs welches aus einer Datenbank generiert wird, überhaupt cachen?- ich habe keine Ahnung.
Sofern das Menu nicht oft verändert wird, ist Caching hier durchaus sinnvoll.

2. Ein Blog, welche Methode würde sich hier anbieten, sagen wir es werden 3-4
Beiträge in der Woche verfasst.
Das kommt auf die Menge der Besucher/Kommentare ab.
Grundsätzlich könnte man auch hier die Index Seiten cachen und bei jedem Beitrag den Cache einmal leeren.

3. Ein Forum wie dieses (o.ä.), also wirklich viele Änderungen alle paar Minuten.
Hier werden meist die Templates gecached, sprich die Templates müssen nicht jedesmal neu geparsed werden, sondern besitzen direkt die PHP Version. (Ähnlich dem $compile_dir bei Smarty z. B.)

4. Oder aber ein Firmen Portrait auf dem sich vielleicht einmal monatlich etwas ändert.
Auch hier bietet sich Caching an und kann bei Änderung aktualisiert werden.

Was wird alles gecached wenn ich einfach nur per header() ein expire Datum in der Zukunft angebe?
Das hängt vor allem mit dem Browser zuasmmen. Wieviel Cache ihm gegeben wird, wie er konfiguriert ist, usw.
Wenn er kann, speichert er alles ab. Sprich HTML, Bilder, usw.


Grundsätzlich kann man sagen, dass sich ein Cache immer lohnt.
Natürlich sollte man ein performantes Cache System einsetzen, damit nicht der Gewinn beim Anzeigen der Seiten durch das Arbeiten des Caching Systems wieder verloren geht.

Grundsätzlich ist der Wikipedia Artikel zu Cache ganz interessant.

Das mal als kleiner Einstieg.
Im Buch von George Schlossnagle Professionelle PHP 5 Programmierung gibt es auch ein sehr interessantes Kapitel über Cache und besonders die verschiedenen Arten von Caching.
 
Bringt mich jetzt leider ehrlich gesagt alles nicht richtig weiter. Die Erkenntnis das cachen gut tut
ist natürlich vorhanden ;) Nur welche Möglichkeiten werden im Umgang mit PHP geboten?

Was das Menü betrifft. Sagen wir man hat ein dynamisches Menü welches sich auf jeder
Seite anders darstellt, und nun hat eine Webseite 100 Seiten, speichere ich dann für jede
Seite eine HTML Datei mit dem passenden Menü dazu?


Das hängt vor allem mit dem Browser zusammen. Wieviel Cache ihm gegeben wird, wie er konfiguriert ist, usw.
Wenn er kann, speichert er alles ab. Sprich HTML, Bilder, usw.

HTML? Also die gerenderte php Datei? Wozu bräuchte man dann cache daten?
Das ist was ich mich gerade vor allem frage. Ich habe meine php Daten und gebe
per Header ein expire Datum an. Wird der ausgelieferte HTML Code gecached?
Wie gesagt wozu sollte man die Ausgabe dann extra in ein html file speichern?
Die Browserseite war nicht gefragt, sondern was ist möglich auf diese für mich
am einfachsten klingende Weise zu cachen? Ich weiß ich kann javascript, css,
Bilder cachen. Aber wie sieht es mit dem gerenderten HTML Quelltext aus und
vor allem wie gehe ich vor wenn dieser sich oft verändert.

Ich hoffe das macht das Problem und die Fragestellung etwas klarer.


Trotzdem danke, auch für den Buchtipp werde ich mir eventuell mal anschauen gehen.
 
Zuletzt bearbeitet:
Ein Expire Datum ist einzig und allein für den Browser interessant. Dem Server ist das vollkommen egal.

HTTP/1.1 Header Field Definitions
Springe zu Punkt:
14.9 Cache-Control
14.9.1 What is cacheable?
14.9.2 What may be stored by Cache
usw. bis 14.9.6 Cache Control Extensions


PHP selbst hat einige Module zum Cachen, wie z. B. MemCache.
Ansonsten gibt es auch einige Caching Klassen wie z. B. PEAR::Cache_Lite.

Was das Menu betrifft:
Ja, das hängt u.a. davon ab, wieviel Rechenleistung die Erzeugung benötigt und ob es sich lohnt das ganze auf das Dateisystem auszulagern.
Nehmen wir an es wären 5 Datenbankqueries, 3x Sortieren und ausgeben. Das wären bei 5 Usern pro Sekunde schon einige Arbeit.
Vergleichen dazu wäre das Laden einer HTML Datei viel weniger Aufwand.
Und da das Menu nicht permanent neu gecached werden muss, da es zwar als Gesamtes dynamisch ist, für jede Seite aber statisch, könnte es nach Erzeugung als Permanent Cache auf dem Webspace liegen. Und nur bei Änderung müsste man den Cache erneuern.
 
Ein Expire Datum ist einzig und allein für den Browser interessant. Dem Server ist das vollkommen egal.

Klar, ich meinte auch mich interessieren da erstmal keine Browsereinstellunge u.ä.


HTTP/1.1 Header Field Definitions
Springe zu Punkt:
14.9 Cache-Control
14.9.1 What is cacheable?
14.9.2 What may be stored by Cache
usw. bis 14.9.6 Cache Control Extensions

Die Überschriften lassen vielleicht darauf hin deuten, aber findest du in dem Text
auch wirklich die Antworten auf meine Fragen? Ich leider nicht oder ich verstehe
da nur etwas nicht. Also falls mich da mal jemand aufklären könnte wäre nett.


PHP selbst hat einige Module zum Cachen, wie z. B. MemCache.
Ansonsten gibt es auch einige Caching Klassen wie z. B. PEAR::Cache_Lite.

Das habe ich auch alles schon gesehen. Aber bevor ich die Theorie nicht verstanden
habe bringt mich das auch nicht weiter.

Was das Menu betrifft:
Ja, das hängt u.a. davon ab, wieviel Rechenleistung die Erzeugung benötigt und ob es sich lohnt das ganze auf das Dateisystem auszulagern.
Nehmen wir an es wären 5 Datenbankqueries, 3x Sortieren und ausgeben. Das wären bei 5 Usern pro Sekunde schon einige Arbeit.
Vergleichen dazu wäre das Laden einer HTML Datei viel weniger Aufwand.
Und da das Menu nicht permanent neu gecached werden muss, da es zwar als Gesamtes dynamisch ist, für jede Seite aber statisch, könnte es nach Erzeugung als Permanent Cache auf dem Webspace liegen. Und nur bei Änderung müsste man den Cache erneuern.

Die Rechenleistung wäre in dem Fall enorm das denke ich mir auch. Und wenn sich
das Menü nicht oft ändert war mir auch klar dass man beim ändern des Menüs die
cache Daten dann einfach erneuert, aber dann hundert Dateien zu schreiben?
Deshalb frage ich auch nach Dingen wie MySQL Query Cache und welche Möglichkeiten
sind auf Serverseite gegeben eventuell auszuführenden PHP Code zu cachen o.ä.
 
Genau dafür ist memcache doch da?
Mit memcache kannst du serverseitig cachen. (PHP Code)

memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.
http://www.danga.com/memcached/

MySQL query caching is less than ideal, for a number of reasons:

* MySQL's query cache destroys the entire cache for a given table whenever that table is changed. On a high-traffic site with updates happening many times per second, this makes the the cache practically worthless. In fact, it's often harmful to have it on, since there's a overhead to maintain the cache.
* On 32-bit architectures, the entire server (including the query cache) is limited to a 4 GB virtual address space. memcached lets you run as many processes as you want, so you have no limit on memory cache size.
* MySQL has a query cache, not an object cache. If your objects require extra expensive construction after the data retrieval step, MySQL's query cache can't help you there.

If the data you need to cache is small and you do infrequent updates, MySQL's query caching should work for you. If not, use memcached.
Ebenfalls von der memcache Page.

Da steht eigentlich alles was du wissen möchtest.

P.S.:
Der Link zum HTTP RFC war nur als Erklärung zum Expire gedacht. Bzw. wie HTTP Caching funktioniert.

Und übrigens, natürlich wäre der Rechenaufwand 100 Seiten gleichzeitig zu speichern enorm, aber du könntest ja On-Demand cachen. Sprich erst beim Aufruf wird geprüft, ob ein Cache vorhanden ist, falls nein, wird eben einer erstellt.
Natürlich könnte das zu Ladeschwierigkeiten bei einigen Usern führen, aber auch nur für kurze Zeit.
Und der HTML Code eines Menus ist meist nicht so groß, dass es allzulange dauern würde.
 
Ah ok danke! Jetzt kommt es dem nahe was ich mir vorstellte. Ist eben schwer zu
beschreiben was man sucht wenn man es eigentlich nicht so genau weiß.

Würdest du denn memcache empfehlen? Um nochmal die Begriffe geklärt zu haben,
dabei handelt es sich jetzt um compiler cache? Oder würdest du etwas anderes
empfehlen? Und ist dass dann ähnlich http://www.php.net/manual/de/ref.apc.php ?

Wenn ich mich jetzt also intensiv mit dem Thema beschäftigen will, hättest du
einen Tip für Dinge die ich mir auf jeden Fall mal ansehen sollte?


Vielen dank nochmal.
 
Ich hatte (leider) noch kein Projekt, bei dem ich mit einem Compiler Cache arbeiten konnte/durfte, daher gehen meine Erfahrungswerte gegen Null.

Grundsätzlich kann ich dir aber folgende Stichwörter reinschmeißen:
Reverse Proxy
APC
Zend Perfomance Suite
Turck MMCache
 
Zurück