PHP besitzt selbst keinen Cache, was dazu führt, dass ein Skript bei jedem Aufruf neu übersetzt werden muss. Um dem entgegenzuwirken, gibt es einige Erweiterungen, die diese Funktionalität nachrüsten, wie beispielsweise den eAccelerator den alternativen PHP Cache.
Da PHP selber noch keinen Cache besitzt, was zur Folge hat das die Skript immer und immer wieder neu übersetzt werden müssen, gibt es ein paar Erweiterungen, welche diese Funktion nachrüsten. Und schon sind wir beim Thema.
1.) APC (Alternative PHP Cache)
APC ist ein Open-Source-Zusatzmodul für PHP, das eine beschleunigte Ausführung von PHP-Programmen ermöglicht. Die Beschleunigung wird dadurch erreicht, dass der kompilierte PHP-Quelltext zwischengespeichert wird und bei wiederholter Ausführung das zeitaufwändige Kompilieren nahezu vollständig vermieden werden kann. – Wiki
Als erstes schauen wir uns unsere aktuelle php-Config an…
vim /var/www/info.php
< ?php
phpinfo();
?>
w3m deine_webseite.abc/info.php
Zudem prüfen wir eben noch die momentane Geschwindigkeit unserer Webseite… z.B. auf www.linkvendor.com und internetsupervision.com
Nun installieren wir APC:
aptitude install php-pear
aptitude install php5-dev apache2-prefork-dev build-essential
pecl install apc
vim /etc/php5/conf.d/apc.ini
extension="apc.so"
apc.enabled=1
apc.file_update_protection=2
apc.optimization=0
apc.shm_size=32
apc.shm_segments=1
apc.gc_ttl=7200
apc.ttl=7200
apc.num_files_hint=1024
apc.enable_cli=0
Die Größe an Dateien welche im Speicher (apc.shm_size) gehalten wird, kann man ganz nach Auslastung des Servers anpassen. Um sich anzeigen zu lassen, wie viel der momentane maximal Wert ist, kannst du folgenden Befehl ausführen. (max seg size (kbytes) = 32768 -> 32MB) Wer einen Root-Server hat kann unter (/etc/sysctl.conf) die folgenden Werte entsprechend anpassen: kernel.shmall, kernel.shmmax
ipcs -lm
/etc/init.d/apache2 restart
[stextbox id=”info”]Die komplette Dokumentation kann im PHP Manual gefunden werden: http://de2.php.net/manual/de/ref.apc.php[/stextbox]
2.) eAccelerator
eAccelerator ist eine Open Source Software zum Einsatz auf Webservern, die als Beschleuniger, Optimierer und Cache für PHP-Seiten dient. – Wiki
Wir schauen uns wieder unsere aktuelle php-Config an…
vim /var/www/info.php
<?php phpinfo(); ?>
w3m deine_webseite.abc/info.php
Geschwindigkeit unserer Webseite prüfen… z.B. auf www.linkvendor.com und internetsupervision.com
Nun installieren wir eAccelerator:
aptitude install build-essential php5-dev git
cd /usr/src/
git clone https://github.com/eaccelerator/eaccelerator
cd eaccelerator/
phpize
./configure
make
make install
vim /etc/php5/conf.d/eaccelerator.ini
;[eaccelerator]
extension = "eaccelerator.so"
eaccelerator.enable = "1"
eaccelerator.shm_size = "0"
eaccelerator.optimizer = "1"
eaccelerator.debug = "0"
eaccelerator.cache_dir = "/tmp/eaccelerator"
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
eaccelerator.check_mtime = "1"
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "0"
eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
;eaccelerator.compress = "1"
;eaccelerator.compress_level = "6"
;eaccelerator.keys = "shm"
;eaccelerator.sessions = "shm"
;eaccelerator.content = "shm"
;eaccelerator.allowed_admin_path = ""
mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator
/etc/init.d/apache2 restart
Und noch einmal die Geschwindigkeit deiner Webseite prüfen… z.B. auf www.octagate.com und internetsupervision.com
Konfiguration von eAccelerator:
—————————————
eaccelerator.shm_size
Die Menge an Arbeitsspeicher (in Megabytes) welche eAccelerator verwenden darf.
Der Standard Wert ist “0”.
eaccelerator.cache_dir
Gibt das Verzeichnis an, wo eAccelerator die vorkompilierten Daten auf der Festplatte speichern darf. Die gleichen Daten können auch im Speicher oder auch nur im Speicher untergebracht werden, was einen schnelleren Zugriff zu folge hätte.
Der Standard Wert ist “/tmp/eaccelerator”.
eaccelerator.enable
Ein- / Ausschalten von eAccelerator. Wobei “1” gleich “an” bedeutet.
Der Standard Wert ist “1”.
eaccelerator.optimizer
Hier kannst du Ein- / Ausschalten ob der PHP-Code noch optimiert werden soll. Wobei “1” gleich “an” bedeutet.
Der Standard Wert ist “1”.
eaccelerator.debug
Hier kannst du das Debug-Logging Ein- / Ausschalten.
Der Standard Wert ist “0”.
eaccelerator.check_mtime
Ein- / Ausschalten für die Prüfung, ob der PHP-Code geändert wurde und somit doch noch mal neu übersetzt werden sollte. Wobei “1” gleich “an” bedeutet.
Der Standard Wert ist “1”.
eaccelerator.filter
Hier kannst du angeben welche Daten gecacht werden sollen. (z.B. “*.php *.phtml”) Wenn der Eintrag mit einem “!” beginnt, bedeutet dies, das diese Daten nicht gecacht werden. Der Standard Wert ist “”. -> was bedeutet, dass alles gecacht wird.
eaccelerator.shm_max
Wenn sehr große Daten nicht in den Arbeitsspeicher wandern sollen, dann mann man diesen Wert setzten. (z.B. 10240, 10K, 1M).
Der Standard Wert ist “0”.
eaccelerator.shm_ttl
Wenn eaccelerator keinen Arbeitsspeicher mehr zur Verfügung hat, werden alle Daten gelöscht, welche älter sind als z.B. “9000” Sekunden (Webseiten welche die letzten 2 1/2 Stunden nicht besucht wurden)
Der Standard Wert ist “0”.
eaccelerator.shm_prune_period
Wenn eaccelerator keinen Arbeitsspeicher mehr zur Verfügung hat, werden die Daten welche vor z.B. 9000 Sekunden gecacht wurden gelöscht.
Der Standard Wert ist “0”.
eaccelerator.shm_only
Ein- / Ausschalten vom Cache auf der Festplatte.
Der Standard Wert ist “0”. -> Was bedeutet das sowohl im Arbeitsspeicher als auch auf der Festplatte gecacht wird.
eaccelerator.compress
Ein- / Ausschalten der Komprimierung der Daten.
Der Standard Wert ist “1”.
eaccelerator.compress_level
Stellt den Grad der Komprimierung ein.
Der Standard Wert ist “9”. -> Max. Komprimierung
3.) XCache
Opcode-Cacher zum PHP-Beschleunigen auf Servern, beschleunigt den Prozess des Kompilierens von PHP-Skripten, indem er den kompilierten Zustand von PHP-Skripten im RAM zwischenspeichert und die kompilierte Version direkt aus dem Hauptspeicher nutzt.
aptitude install php5-xcache
Hier noch meine Konfiguration für das WordPress Plugin “W3 Total Cache” …
vim /etc/php5/conf.d/xcache.ini
; configuration for php xcache module
[xcache-common]
extension=xcache.so
[xcache.admin]
xcache.admin.enable_auth = Off
;xcache.admin.user = "admin"
;xcache.admin.pass = ""
[xcache]
; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0 (Standard)
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 64M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count = 1
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0
; same as aboves but for variable cache
xcache.var_size = 64M
xcache.var_count = 1
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 900
xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
;
; xcache.mmap_path = "/dev/zero"
; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
;
; xcache.coredump_directory = ""
; per request settings
xcache.cacher = On
xcache.stat = Off
xcache.optimizer = On
[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
;
;xcache.coverager = Off
; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
;
;xcache.coveragedump_directory = ""
weiter Infos zu xCache: xcache.lighttpd.net/wiki/XcacheIni
Test-Ergebnisse:
Mit folgendem Befehl habe ich die Geschwindigkeit meiner Webseite getestet, wobei ich in der Zwischenzeit, vom apache2 als Webserver Abstand genommen habe und voll auf “nginx” setzte. :-)
ab -n500 -c20 -dS "http://suckup.de/"
Somit wurden 500 Seitenaufrufe, davon 20 parallel ausgeführt, um einen Durchschnittswert zu erhalten habe ich den Befehl 3x ausgeführt und xCache war ein wenig schneller!!! :-)