• Simplen Cache mit PHP erstellen

    Caching ist die wohl am meisten verwendetet Technik um Performance zu steigern, sei es direkt im Prozessor um Arbeitsspeicherzugriffe zu vermindern, oder um Datenbankanfragen bei Webseiten zu speichern. In diesem kleinen Screencast zeige ich, wie man mit relativ wenig Einsatz einen simplen Cache mit PHP basteln kann. Mit Hilfe dieses Caches ist es nicht nur möglich ganze HTML Seiten zu speichern, sondern auch einzelne Objekte.



    Wer lieber ein geschriebenes Tutorial vorzieht, findet nachfolgend einen kleinen Artikel, der genau auf dem im Video vorgestellen PHP Cache basiert.




    Ein Cache ist ein probates Mittel um die Performance einer Applikation zu steigern, dabei werden Caches nicht nur auf Softwareebene eingesetzt, sondern können auch direkt in der Hardware implementiert sein. Der Cache eines Prozessors zum Beispiel hilft, die Anzahl der Hauptspeicherzugriffe zu verringern. In größeren Webanwendungen sind vor allem Datenbankzugriffe ressourcenlastig und ein Kandidat, um einen Cache zu verwenden. In diesem Artikel geht es nun darum einen solchen kleinen Cache in PHP zu erstellen.

    save_cache() und load_cache()

    Der Cache wird aus nur 2 Funktionen bestehen, natürlich könnte man auch eine komplexere Klasse erstellen, aber dafür gibt es bereits erprobte Lösungen (z.B. Zend Cache). Die Funktion save_cache() ist, wie der Name schon vermuten lässt, für das Speichern zuständig. Bevor wir loslegen können müssen wir uns noch überlegen, wie und was der Cache eigentlich speichern soll. Fertige HTML Seiten oder gar einzelne Objekte ? Um ganze Objekte zu speichern, muss man sich überlegen, wie man ein Objekt so serialisiert, damit man es auf der Festplatte speichern kann und später wieder richtig interpretiert.

    Zum Glück hat dieses Problem PHP bereits gelöst, mit den Funktionen serialize() und unserialize() können Objekte als String dargestellt werden.

    Die Funktion um den Cache anzulegen sieht dann folgendermaßen aus:
    PHP-Code:
    function save_cache($data$key) {  
            
    $key md5($key);  
            
    $data serialize($data);  
            
    file_put_contents('ORDNER/cache_data/'.$key$data);  

    Um auf die gecached’te Datei wiederzugreifen zu können, erhält sie einen eindeutigen Schlüssel.
    Mit dieser 3 – zeiligen Funktion ist es bereits möglich, praktisch jedes Objekt serialisiert auf der Festplatte zu speichern.

    PHP-Code:
    // Zu cachende Objekt  
    $array = array('name' => 'm0d''Homepage' => 'http://staticfloat.com');  
    // Cache anlegen  
    save_cache($array'meinArray'); 
    load_cache()

    Natürlich nützt der Cache bisher noch nicht viel, da wir noch keine Daten aus ihm laden können. Der Cache soll natürlich auch nicht ewig gültig sein, sondern nur eine bestimmte Zeitspanne.

    PHP-Code:
        function load_cache($key$expire) {  
                
    $key md5($key);  
                
    $path 'cache_data/'.$key;  
                if(
    time() < (filemtime($path) + $expire)) {  
                    return 
    unserialize(file_get_contents($path));  
                }  
                
    unlink($path);  
                return 
    false;  
        } 
    Die Funktion erhält 2 Parameter, der erste ist der Schlüssel unter dem der Cache angelegt wurde. Der zweite Parameter $expire, ist ein Wert in Sekunden, der festlegt wie lange die Cachedatei gültig ist. Dabei wird ab dem Zeitpunkt des Erstellens der Datei gerechnet. Ein Wert von $expire = 300 würde nur einen Cache Hit zurückliefern, wenn die Datei weniger als 5 Minuten alt ist.

    Beispiel

    PHP-Code:
        $data load_cache(‘meinArray’300); 
    In der Variable $data wäre nun wieder der Array von oben gespeichert.

    Achtung

    In beiden Funktionen wird keine Überprüfung durchgeführt, ob die entsprechenden Dateien überhaupt existieren!
    PHPler bedankt sich. 


     
    Kommentare 8 Kommentare
    1. Avatar von zer0
      zer0 -
      Hey,

      ein paar Benchmarks zu deiner Lösung wäre noch schön!
    1. Avatar von countryqt30
      countryqt30 -
      Schoen erklaert, ich kann mir aber nicht vorstellen, dass das recht performant funktioniert.
      1000 Dateizugriffe in der Sekunde sind keine Alternative zu 1000 SQL Abfragen/s .
    1. Avatar von ComFreek
      ComFreek -
      Ich find's gut, dass du auch einen Text geschrieben hast. Kann ich mir schneller durchlesen, als im Video immer die Codestellen zu suchen

      Schoen erklaert, ich kann mir aber nicht vorstellen, dass das recht performant funktioniert.
      1000 Dateizugriffe in der Sekunde sind keine Alternative zu 1000 SQL Abfragen/s .
      Dazu habe ich mal einen Test gemacht: 1000 Datensätze und 1000 Dateien.
      DB: 0.025 - 0.035 Mikrosekunden
      Dateien: 0.6 - 0.7 Mikrosekunden
    1. Avatar von Castiel
      Castiel -
      also bei jedem der Strato nutzt ist das System wesentlich schneller (wenn die Mysql Verbindung auch so langsam ist wie bei mir)....

      dort ist der Mysql Server auf einem anderen Host. Die Ladezeit meiner Seite dauert deshalb zwischen 1 Sekunde und 8 Sekunden, was ja echt eine unverschämtheit ist.
    1. Avatar von m0dpad
      m0dpad -
      Zitat Zitat von countryqt30 Beitrag anzeigen
      Schoen erklaert, ich kann mir aber nicht vorstellen, dass das recht performant funktioniert.
      1000 Dateizugriffe in der Sekunde sind keine Alternative zu 1000 SQL Abfragen/s .
      Wenn man eine Abfrage hat, die Recht komplex ist (z.B. Mit subqueries etc.) kann die bei einer entsprechenden Größe der Datenbank schon relativ lange dauern. Auf diese Weise speichert man eben direkt das Ergebnis und kann dann wieder in Konstantzeit darauf zu greifen. Einfache Abfragen wie einen "SELECT COUNT(*)" zu cachen macht in der Regel relativ wenig Sinn.

      Das einfache(!!) Datenbankzugriffe in der Regel schneller sind ist klar. Es kann auch die komplette Seite gecached werden, dann spart man sich alle Datenbankabfragen und PHP Verarbeitung.

      Theoretisch könnte man die gecachten Daten auch in einer Datenbank ablegen mit Primary Key auf dem Cache - Schlüssel, dann sollten die Daten quasi instant da sein.
    1. Avatar von MArc
      MArc -
      Hey,

      ich habe bzgl. Geschwindigkeit einen Benchmark gefahren:

      http://www.tutorials.de/blogs/marc/1...benchmark.html

      Gruesse,
      MArc
    1. Avatar von erik s.
      erik s. -
      Mal eine Offtopic-Frage: Welche IDE verwendest du?
    1. Avatar von m0dpad
      m0dpad -
      Das müsste Netbeans sein.