PHP APC & APCu

  • In diesen Beiträgen stelle ich euch APC & APCu vor. Diesen beiden PHP Erweiterungen sind zum cachen von Daten gedacht, also zum Zwischenspeichern im Arbeitsspeicher um genauer zu sein. Ich werde im folgenden auf die Geschichte, den Stand und die Benutzung beider Erweiterungen eingehen. Angefangen mit APC und dann APCu.

    In diesen Beiträgen stelle ich euch APC & APCu vor. Diesen beiden PHP Erweiterungen sind zum cachen von Daten gedacht, also zum Zwischenspeichern im Arbeitsspeicher um genauer zu sein. Ich werde im folgenden auf die Geschichte, den Stand und die Benutzung beider Erweiterungen eingehen. Angefangen mit APC und dann APCu. Wir werden uns in diesem Beitrag also auf den User-Cache beschränken und nicht auf das cachen von ganzen Datein um das erneute ausführen von Skripten zu beschleunigen. [1]

    1 APC

    1. Geschichte
    2. Benutzung

    1.1 1. Geschichte

    APC wurde als Open-Source Erweiterung entwickelt und dient zur Beschleunigung von Skripten und zum Abspeichern einzelner Werte oder komplexen Objekten im Arbeitsspeicher des Webservers. Das Projekt gilt als "unmaintained" und "dead", es wird also seit der letzten stabilen Version (3.1.9 vom 14. Mai 2011) mehr weiterentwickelt, weswegen von der Benutzung abgeraten wird. Es gibt jedoch viele gute Alternativen wie OPcache und APCu.

    1.2 2. Benutzung

    Um APC benutzen zu können muss es erst installiert werden. Unter Ubuntu ist das denkbar einfach:

    Code
    1. sudo apt-get install php-apc

    Alternativ kann man es auch über PECL installieren.


    Nun, wenn wir die Erweiterung installiert habt, können wir die Funktionen benutzen.

    Hier ist eine Tabelle mit allen Funktionen mit ihren Beschreibungen: php.net.


    bool apc_add ( string $key , mixed $var [, int $ttl = 0 ] ): [2]

    Diese Funktion speichert eine neue Variable in dem Cache. Die Parameter $key, $var und optional $ttl.

    $key Der Key ist der Schlüssel unter dem der Wert abgespeichert werden soll.
    $var Das ist die Variable die gespeichert werden soll. Es spielt keine Rolle ob es ein primitiver Datentyp oder ein Objekt ist.
    $ttl"Time To Live" Die Zeit die der Wert im Speicher bleiben soll, danach wird er automatisch gelöscht (Die Zeit wird in Sekunden angegeben). Gibt man diesen Parameter nicht an, so bleibt der Wert gespeichert bis er gelöscht oder überschrieben wird.

    Nun wollen wir mal zu einen Bespiel kommen:

    Code
    1. apc_add("schluessel", "Wert", 60);

    Hier speichern wir den Wert "Wert" mit dem Schlüssel "schluessel" ab. Zugreifen können wir drauf jetzt nur in den nächsten 60 Sekunden, danach ist der Wert gelöscht.

    Aber was bringt uns das abspeichern, wenn wir es nicht auslesen können? Doch können wir!


    mixed apc_fetch ( mixed $key [, bool &$success ] ): [3]

    Mit dieser Funktion können wir Werte auslesen mit dem Schlüssel mit dem wir sie eingespeichert haben.

    Es ist denkbar einfach:

    Code
    1. $hm = apc_fetch("schluessel");
    2. if (!($hm === false)) {
    3. echo $hm; // gibt "Wert" aus.
    4. } else {
    5. // wir haben einen Error
    6. }

    Es gibt nicht viel zu sagen zu der Funktion, außer, dass man zum kontrollieren nicht if (!$hm) benutzen sollte, da wenn der gespeicherte Wert ein leerer Array oder 0 ist, diese Art von Error Handling immer getriggered werden würde.

    Aber wie sieht das aus wenn wir jetzt apc_fetch benutzten obwohl unsere Daten schon gelöscht wurden?


    Dazu gibt es die Funktion mixed apc_exists ( mixed $keys ): [4]


    Mit ihr können wir abfragen ob es überhaupt einen Speicherplatz für den Wert gibt den wir haben wollen. Gehen wir nun davon aus, dass wir den Wert abrufen wollen den wir oben gespeichert haben. Das Problem ist, es sind jetzt etwas mehr als 60 Sekunden vergangen und unser Wert ist schon gar nicht mehr da. Wir würden also einen Fehler verursachen, dafür prüfen wir doch am besten einmal ob der Wert überhaupt noch da ist.

    Code
    1. if (apc_exists("schluessel")) {
    2. $hm = apc_fetch("schluessel");
    3. if (!($hm === false)) {
    4. echo $hm; // gibt "Wert" aus.
    5. } else {
    6. // wir haben einen Error
    7. }
    8. } else {
    9. // Den Wert gibt es nicht.
    10. }

    Nun wissen wir also wie man Werte speichert, abfragt und prüft. Jetzt wollen wir aber einen Wert löschen. Das machen wir gefolgt:


    mixed apc_delete ( string $key ): [5]

    Denkbar einfach zu benutzten. Wir haben nur den Schlüssel den wir löschen wollen.

    Code
    1. if (apc_exists("schluessel")) {
    2. apc_delete("schluessel");
    3. } else {
    4. // Den Wert gibt es nicht.
    5. }

    Es gibt auch noch die Funktion bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] ), welche sich in einem aber wesentlichen Punkt von apc_add() unterscheidet:

    Wenn der Schlüssel bei der Benutzung von apc_add() schon besetzt ist, gibt die Funktion false zurück, bei der Benutzung von apc_store() wird der Wert dann einfach überschrieben. [6]



    Ich hoffe ich konnte euch die Benutzung von APC etwas näher bringen. Bald folgt ein Eintrag über APCu, der Weiterentwicklung. Verbesserungsvorschläge bitte in die Kommentare!


    Liebe Grüße, Bennet.

    Einzelnachweise
    1. https://de.wikipedia.org/wiki/Alternative_PHP_Cache
    2. http://php.net/manual/de/function.apc-add.php
    3. http://php.net/manual/de/function.apc-fetch.php
    4. http://php.net/manual/de/function.apc-exists.php
    5. http://php.net/manual/de/function.apc-delete.php
    6. http://php.net/manual/de/function.apc-store.php

Teilen