Alternative PHP Cache - So bringt Ihr den Opcode-Cache unter Ubuntu an den Start

Wie einige von Euch vielleicht wissen, werden Eure PHP-Skripte vor der Ausführung durch Apache in Bytecode kompiliert. Das kostet Zeit und Serverressourcen. Außerdem geschiet dies bei jedem Aufruf Eures Skriptes aufs neue, selbst wenn sich das Skript schon seit ewigen Zeiten nicht geändert hat. Was läge da näher als diesen Vorgang zwischen zu speichern, um die Last auf Eurem Server zu reduzieren. Eine Möglichkeit dies mit Hilfe des Alternative PHP Cache (APC) zu realisieren, möchte ich Euch heute vorstellen.

Installation

Die Installation des Bytecaches ist denkbar einfach. Wir verwenden wieder unser gewohntes apt-get, um die erforderlichen Pakete zu installieren. Voraussetzung ist hier natürlich wieder einmal, dass wir auf die Shell des Servers zugreifen können und die entsprechenden Rechte haben.

$ sudo apt-get update
$ sudo apt-get install php-pear php-apc

Anschließend muss der Apache neu gestartet werden:

$ sudo service apache2 restart

Der Alternative-PHP-Cache sollte nun bereits laufen. Ihr könnt dies überprüfen, indem Ihr ein phpinfo() aufruft. Dort solltet Ihr dann nach folgenden Einträgen suchen:

Alternative PHP Cache phpinfo()

APC bringt außerdem ein einfaches Debugging-Tool mit. Dieses sollte sich bei Euch im Ordner /usr/share/doc/php-apc befinden. Zunächst müssen wir das Skript allerdings entpacken:

$ gzip -d /usr/share/doc/php-apc/apc.php.gz

Dann müsst Ihr die Datei entweder in Euren Webroot verschieben oder aber einen Link setzen. Vorsicht: Letztere Variante funktioniert nur, wenn die Option FollowSymLinks in diesem Ordner aktiv ist. Wenn nicht, lässt sich das via .htaccess-Datei regeln. Dort gebt tragt Ihr folgendes ein:

Options FollowSymLinks

Anschließend können wir einen Symlink setzen:

$ ln -s /usr/share/doc/php-apc/apc.php /euer-webroot/apc.php

Grundsätzlich ist es natürlich keine gute Idee diese Datei für alle Welt zugänglich zu machen. Wie Ihr den Zugriff durch unbefugte verhindert, erfahrt Ihr in einem anderen Artikel.

Konfiguration

Nun haben wir auch schon bereits alles Nötige getan, um uns auf die Konfiguration von APC vorzubereiten. Hierzu sei gesagt, dass die Standardeinstellungen von APC in den meisten Fällen bereits ausreichen. Die derzeitige Konfiguration lässt sich nun via apc.php aufrufen.

Hier springt natürlich als erstes die grafische Anzeige zur Auslastung des Caches ins Auge. Wichtig ist eine hohe Hitrate und eine niedrige Fragmentierung zu erreichen. Die Fragmentierung wird mit der Dauer der Benutzung immer weiter zunehmen, also ist es ratsam den Cache ab und an zu leeren.

Alternative PHP Cache Status 1

Tatsächlich wird der Cache bei jedem Neustart von Apache wieder zurückgesetzt und auch bei jedem Erreichen der maximalen Größe. Die genauen Daten zu den Cacheleerungen entnehmt Ihr dem Bereich links der Grafik:

Alternative PHP Cache Status 2

Eure aktuelle Konfiguration findet Ihr weiter unten im Detail aufgelistet. Die Einstellungen könnt Ihr in der apc.ini anpassen. Jeden Einstellungsänderung erfordert einen Neustart.

Alternative PHP Cache Config

Auf die einzelnen Einstellungsmöglichkeiten möchte ich hier nicht im Detail eingehen. Genauere Infos dazu könnt Ihr der Dokumentation entnehmen. Die Konfigurationsdatei findet Ihr unter diesem Pfad /etc/php5/conf.d/apc.ini. Macht Euch vor jeder Änderung ein Backup. Vorsicht: Stellt Ihr die shm_size höher ein, als Euer Server zulässt, hängt sich der Apache beim Neustart auf!

Verwendung in PHP

Eines der coolsten Features von APC ist, dass man den Cache auch innerhalb seiner Skripte verwenden kann. Hiermit seid Ihr in der Lage Daten beinahe jeglicher Form über APC zwischen zu speichern. Verschiedene Frameworks und Content-Management-System bieten hierfür bereits vorgefertigte Lösungen. Eure Daten werden dann vom Alternate-PHP-Cache im Arbeitsspeicher abgelegt, aus dem sie sehr viel schneller wieder abgerufen können, als beispielsweise aus der Datenbank. Aber Vorsicht: Der Cache wird bei jedem Apache-Neustart geleert. Dies solltet Ihr bei der Benutzung bedenken.

Ich möchte Euch hier nur einige wenige Befehle an die Hand geben, mit denen Ihr schon jetzt arbeiten könnt. Die Befehle sind der Seite php.net entnommen:

apc_store(string $key , mixed $var)

Speichert die Variable $var unter dem Schlüssel $key.

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

Gibt die unter dem Schlüssel $key gespeicherte Variable zurück.

apc_clear_cache ([ string $cache_type = "" ] )

Leert den Cache des Typs $cache_type. Der Cache innerhalb des PHP-Codes hat den Typ "user". Gebt Ihr hier nichts an, wird der Bytecache geleert.

Weitere Befehle und Informationen findet Ihr hier:
http://www.php.net/manual/de/ref.apc.php

Alternativen und weiterführende Links

Natürlich ist der APC nicht die einzige Variante eines Bytecaches für PHP. Alternativen sind beispielsweise eAccelerator, XCache und auch Zend Guard (früher Zend Optimizer). Welchem Bytecache Euch letztendlich eher zusagt ist Euch überlassen.

Weitere Infos zu PHP-Beschleunigern könnt Ihr hier finden:
http://de.wikipedia.org/wiki/PHP-Beschleuniger