Layoutprobleme? - Styleswitcher!
![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 557
| Ein simples Caching System mittels Dateien Ein kurzes Vorwort Diese Tutorial zeigt eine von sicherlich mehreren Methoden, wie man bestimmte Werte wie Daten aus einer Datenbank (Arrays oder Objekte), aber auch statische Inhalte, wie z.B. komplette Seiten bzw. einzele Teilbereiche mittels PHP und Dateien cachen kann. Der PHPCode ist eine PHP4 Klasse. Ganz einfach aus dem Grund, weil zu viele Leute noch PHP4 auf ihren Servern laufen haben und ich Fragen zu "warum geht der Code nicht" einfach vorgreifen wollte. Zum besseren Verständnis habe ich die Klasse und die Methoden auf deutsch dokumentiert. Am Ende dieses Tutorials sind noch 2 Beispiele angegeben, um die Klasse zu testen. Inhaltsverzeichnis Geändert von Ben (25.05.2007 um 10:03 Uhr). Grund: links an aktuelle Struktur angepasst |
| | |
| | Nach oben #2 |
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 557
| 1. Grundlegende Überlegungen zum Thema Caching Was ist dieses "Caching" eigentlich und wozu brauche ich es? Die Art des Cachings, die in diesem Tutorial angesprochen wird, wird dazu benutzt um den eigenen Server zu entlasten. Jede etwas größere Seite (Communities, aber auch Blogs etc) ist meistens so konzepiert, dass sie dynamische Inhalte und/oder Daten benötigt, beispielsweise aus einer Datenbank wie MySQL. Je mehr und komplexer diese Abfragen sind, desto mehr muss der dahinterstehende Server selbstverständlich arbeiten. Das Caching kann dem Server diese Arbeit abnehmen, indem es bestimmte Inhalte, die nicht jedesmal neu geladen werden müssen, statisch abspeichert (z.B. in einer Datei) und daraus ausliest. Dabei wird eine maximale Lebensdauer dieser Cachedaten angegeben. Beim überschreiten dieser Zeit, werden diese gecachten Daten gelöscht, erneut aus der Datenbank ausgelesen und in den Cache geschrieben. Es gibt aber auch die Möglichkeit die Daten solange im Cache zu behalten, bis sie geändert werden (z.B. bei gecachten News ein neuer Newseintrag vom Admin). Dazu ein kleines Beispiel: In einer großen Community (> 1000 User) hat jeder User ein eigenes Profil. Erfahrungsgemäß ändert ein User sein Profil nicht sehr oft. Hier wäre ein optimaler Punkt, das Caching einzusetzen. Das Profil wird also gecached, und so lange im Cache behalten, bis der User sein Profil ändert. Tut er dies, so wird der Cache einfach neu beschrieben und wieder so lange behalten, bis dieser User wieder etwas ändert. So erstpart man dem Server eine (oder mehr) komplexe Abfragen an die Datenbank, denn meistens sind die Userprofile gespickt mit Daten, die verteilt in der Datenbank liegen (z.B. Username, Alter, Bilder, Usergruppe, etc), denn Profile werden viel öfter aufgerufen, als dass sie geändert werden. |
| | |
| | Nach oben #3 |
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 557
| 2. Aufbau der Caching-Klasse Nun aber zum konkreten PHPCode. Wie in dem Vorwort schon beschrieben, werde ich die Klassen so schreiben, dass Sie kompatibel zu PHP4 sind, da diese Version doch noch auf vielen Servern vorhanden ist. Um alle oben genannten Funktionen umzusetzen, werden folgende Methoden benötigt: PHP-Code: Geändert von Chr!s (05.11.2006 um 03:00 Uhr). |
| | |
| | Nach oben #4 |
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 557
| 3. Die Caching-Funktionen im Detail Bevor ich auf die Funktionen im Einzelnen eingehe, werde ich noch etwas über die allgemein Funktionalität dieser Cache-Klasse eingehen. Der Klasse ist es egal, was für Daten ihr zum Cachen gegeben werden. Seien es Arrays, Objekte, reiner Text, HTML (was ja "reinem" Text entspricht). Durch das Einsetzen der Funktion serialize() bzw unserialize() werden die übergebenen Daten in ein einheitliches Format gebracht und im Cache gespeichert. Dabei wird jedem Eintrag ein Timestamp ("Zeitstempel" in Sekunden) angehängt, welcher angibt, wie lange der Eintrag haltbar ist (die sog. lifetime). Machen wir uns zuerst an den Konstruktor der Klasse, die Funktion Cache(). Diese Funktion braucht weder Parameter noch sonst etwas, sie dient lediglich dazu, den angegebenen Cache-Pfad mittels der Funktion realpath() zu einem absoluten Pfad umzuwandeln. Einige Betriebtssysteme ärgern sich über relative Pfadangaben ( wie z.B. './cache/' anstatt von '/etc/home/user123/script/cache/' ) oder streiken gar komplett. Nun aber an die Funktion: PHP-Code: Um nun nicht jedesmal sämtliche Pfadangaben usw tippen zu müssen, hab ich eine kleine Helfer-Funktion erstellt, die einem jedesmal den benötigten Dateinamen inklusive Pfadangabe zurückgibt. Falls gewünscht, wird der Cache-Name mittels der Funktion sha1() gehasht. Diese Methode trägt den Namen getFileName. PHP-Code: Nun, so simpel ist das Ganze dann doch wieder nicht, schließlich müssen ein paar Problemfälle durchgegangen werden, bevor der Cache wirklich gelesen werden kann. Dabei hat die Methode zwei Möglichkeiten, einen Wert zurückzugeben: false, wenn das Vorhaben gescheitert ist, und mixed (also entweder ein string, ein array, ein Objekt ..), wenn die Funktion erfogreich war und die Daten lesen konnte. Ich werde diese Funktion hier Schritt für Schritt durchgehen, mit ein paar Worten zu jedem Abschintt. Fangen wir also an, mit der Methode namens readCache(). PHP-Code: Jetzt haben wir schonmal geprüft, ob die Datei wirklich da ist, und sie lesbar ist. Jetzt steht uns eigentlich nichts mehr im Weg. Öffnen wir nun diese Datei, und lesen deren Inhalt aus: PHP-Code: Die hauptsächliche Arbeit findet nun in den nächsten Codezeilen statt. Hier werden die Cache-Daten wieder ent-serialisiert ( unserialize() ). Wie bereits am Anfang des Tutorials beschrieben, wird an jede Cache-Datei ein Timestamp angehängt, der die Lebensdauer des Cache-Eintrages angibt. Dieser muss nun ausgelesen werden, und es muss geprüft werden, ob der Cache-Eintrag überhaupt noch gültig ist. Wenn ja, kann er zurückgegeben werden - wenn nicht, wird der Cacheeintrag gelöscht, und die Methode wird false als Rückgabewert liefern: PHP-Code: PHP-Code: Diese hat die Aufgabe, die übergebenen Daten (sofern welche vorhanden sind) zu serialisieren ( serialize() ) und in den Cache zu schreiben. Optional kann dabei die speziell für diesen Cache-Block gewünschte Lebensdauer angegeben werden. PHP-Code: PHP-Code: Im nächsten Schritt werden wir die Datei versuchen zu öffnen. Falls dies misslingt, wird die Funktion den boolschen Werrt false zurückgeben. Gelingt es die Datei zu öffnen oder gar neu anzulegen, wird die Datei gesperrt (sodass kein anderer Prozess in diesem Moment auf die Datei zugreifen kann), und mittels der Funktion ftruncate() geleert: PHP-Code: PHP-Code: PHP-Code: PHP-Code: PHP-Code: Diesmal müssen wir aber nicht prüfen, ob der Cache-Eintrag schon abgelaufen ist, denn das spielt hier keine Rolle. Wir müssen lediglich die Datei löschen, sofern sie überhaupt existiert. PHP-Code: Was wir natürlich nicht vergessen dürfen ist, die Klasse zu beenden: PHP-Code: Und somit haben wir unsere komplette kleine Cache-Klasse fertig. Sicherlich lässt sich diese noch ausbauen, aber für ein kleines und simples System müsste diese Ausführung ausreichen. Geändert von Chr!s (09.11.2006 um 22:33 Uhr). |
| | |
| | Nach oben #5 |
| Christian Mühlroth Registriert seit: 04.09.2005 Ort: Nürnberg
Beiträge: 557
| 4. Zwei einfache Anwendungsbeispiele Selbstverständlich kann ich diese Klasse nicht einfach so auf sich beruhen lassen. Deshalb hier zwei kleine Anwendungsbeispiele, einmal für Daten wie Text, HTML, etc, und einmal eins für Arrays, Objekte, was auch immer. Beispiel 1: PHP-Code: PHP-Code: Geändert von Chr!s (09.11.2006 um 22:34 Uhr). |
| | |
![]() |
« [PHP] Wiederverwendung von Berechnungen, effektives Caching
|
[PHP] Counter mit mysql (kurz und knackig) »
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| GZip-Komprimierung mehrerer Dateien mittels PHP | Chr!s | PHP-Programmierung | 4 | 07.04.2007 14:10 |
| [PHP] Wiederverwendung von Berechnungen, effektives Caching | Ben | Tutorials | 4 | 27.07.2006 19:55 |
| Caching mittels dbm-Dateien, Probleme mit dba_popen() | Ben | PHP-Programmierung | 4 | 27.07.2006 13:23 |
| [PHP] FTP-Funktionen in PHP nutzen | MrNiceGuy | Tutorials | 0 | 24.05.2006 14:18 |
| [PHP] Erstellung und Bearbeitung von Bildern mittels PHP | WarrenFaith | Tutorials | 1 | 23.08.2005 15:30 |
Alle Zeitangaben in WEZ +2. Es ist jetzt 22:34 Uhr.
Nach oben






