PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


PHP beschleunigen mit dem APC

with 5 comments

Frameworks im Allgemeinen sind eine sehr tolle Sache. Sie bieten eine Menge Klassen und Funktionalitäten, um einem die Arbeit zu erleichtern. Viele Teile eines Frameworks kann man auch einzeln nutzen, und diese sind häufig auch recht schlank gehalten. Kernkomponenten jedoch, wie in diesem Beispiel das MVC-Konzept des Zend Frameworks, neigen dazu, recht viele Funktionen mitzubringen, die man evtl. garnicht alle benötigt. Das hat zur Folge, dass viele Dateien geladen werden, für die der Webserver immer auf die Festplatte zurückgreifen muss. Das selbe gilt natürlich auch für große Projekte, die kein Framework einsetzen, aber sehr viele oder große Scripte verwenden und gut besucht sind. Und wir alle wissen, dass Festplatten noch immer (auch SSDs) eine der langsamsten Komponenten in einem Rechner sind.

Aber es gibt Abhilfe: Caching! Als erstes macht es natürlich viel Sinn, im PHP-Code selbst Daten und Objekte zu cachen. Immer wiederkehrende, sich selten ändernde Datenbank-Ergebnisse zum Beispiel. Diese kann man entweder in der Session speichern, oder in memcached-Instanzen, oder oder. Über Zend_Cache und die verschiedenen Backends hatte ich ja auch bereits geschrieben.

Zweitens macht es aber auch sehr viel Sinn, die PHP-Scripte selbst zu cachen. Erstens liegen sie auf der langsamen Festplatte, und zweitens liegen sie dort ja als Textdateien. Wenn PHP aufgefordert wird, sie auszuführen, erstellt es erstmal aus dieser Textdatei einen Bytecode. Dieser Bytecode ist maschinennah, und ist dann ausführbar. Natürlich kostet dieses Übersetzen Zeit. Im Normalfall wird bei jedem Aufruf das Script neu übersetzt.

Bytecode-Caches, wie APC (Advanced PHP Cache) einer ist, speichern diesen Bytecode zwischen, nämlich im schnellen Arbeitsspeicher. Statt also bei jedem Request 50 Zend-Framework-Klassen zu übersetzen, werden sie einfach aus dem Bytecode-Cache genommen, das bringt Speed!

Der APC soll in (ferner?) Zukunft direkt mit PHP ausgeliefert werden. APC ist aktuell eine PHP-Extension, die man einfach herunterlädt, in der php.ini aktiviert, und dann bekommt man schnellere Webseiten, man muss nicht eine Zeile PHP-Code ändern. Was kann es schöneres geben?

Hier die Installation unter Ubuntu:

sudo apt-get install php-apc

fertig! Wenn man nun eine phpinfo Seite aufruft, ist dort ein Abschnitt über APC enthalten.

apc1

Man kann diese Parameter natürlich alle ändern, vor allem die Cache-Größe sollte man anpassen, damit auch alles reinpasst. Es gibt außerdem ein kleines apc-Admin-Script, mit dem man den aktuellen Stand des Caches anzeigen lassen kann (das ist im Fall von Ubuntu unter /usr/share/doc/php-apc/apc.php.gz zu finden, oder aber im Quell-Archiv der PECL). Dieses php-Script einfach an ein sicheres Verzeichnis des Webservers kopieren, und man erhält beim Betrachten:

apc2

Um die Illusion zu zerstören: Man kann die Ausführungszeit mit dem APC nicht um 99% reduzieren. Aber die 2-5 fache Performance kann man durchaus rausholen, und das mit nur 5 Minuten Arbeit!

Übrigens kann man APC nicht nur zum Cachen des Bytecodes verwenden, nach der Installation kann man auch Objekte, und Daten etc innerhalb der PHP-Scripte im Arbeitsspeicher cachen. Dazu gibt es Funktionen wie apc_store(), apc_fetch usw. Mehr dazu im PHP-Manual.

Neben APC gibt es natürlich auch noch andere Bytecode-Caches. Darunter sind XCache, eAccelerator und Zend Platform/Zend Server.

Written by Michael Kliewe

Oktober 19th, 2009 at 8:38 am

Posted in PHP

Tagged with , , ,

5 Responses to 'PHP beschleunigen mit dem APC'

Subscribe to comments with RSS or TrackBack to 'PHP beschleunigen mit dem APC'.

  1. Hat gerade mein WordPress gekillt 🙂 Mit einem einfachen „install php-apc“ ist es also nicht getan.

    Bastian

    19 Okt 09 at 08:56

  2. Was für ein Fehler ist denn aufgetreten?
    Außerdem testet man sowas erstmal lokal bei sich zuhause 😉

    Michael Kliewe

    19 Okt 09 at 10:18

  3. Keine Ahnung welcher Fehler. Ich hab’s angeschaltet, getestet – ging nicht – wieder ausgeschaltet. Für weitere Experimente fehlt mir einfach die Zeit.

    Bastian

    19 Okt 09 at 11:14

  4. Mit IIS FastCgi läuft APC leider nicht (siehe http://forums.iis.net/t/1147265.aspx ). eAccelerator wäre aber eine Alternative.

    Martin

    19 Okt 09 at 21:22

  5. Das liegt wohl daran wie der IIS die PHP-Prozesse startet. Aber genau in dem Thread steht auch, dass es doch etwas bringt, wenn man die „InstanceMaxRequests“ erhöht. Dann arbeitet ein PHP-Prozess mehrere Requests ab, und das Caching trägt Früchte.

    Außerdem ist der Thread schon 2 Jahre als. „We are working on this issue with the APC owners“. Wäre interessant zu wissen ob das immernoch ein Problem ist.

    (ein Grund mehr, den IIS nicht zu mögen…)

    Michael Kliewe

    20 Okt 09 at 11:42

Leave a Reply

You can add images to your comment by clicking here.