Configuratie van APC. Caching in PHP.
!!! Let op !!! Gebruik APC niet als je PHP versie 5.5 of hoger hebt; OPCache vervangt APC en is ingebouwd in PHP.
Op 21 maart 2013 werd de PHP 5.5 beta 1 uitgebracht met "Zend OPCache" – het lijkt er sterk op dat dit de vervanger voor APC zal zijn, aangezien het is opgenomen in de PHP-kern en moet worden onderhouden voor elke nieuwe release.
APC – Alternative PHP Cache – slaat gecompileerde opcode in de cache op, of zoals de ontwikkelaars het beschrijven: "APC is een gratis, open en betrouwbaar systeem voor het cachen en optimaliseren van tussenliggende PHP-code".
PHP is een programmeertaal op hoog niveau. Zoals bij alle talen op hoog niveau kan deze worden gecompileerd op verschillende platforms. Contentbeheersystemen zoals Drupal bestaan uit honderden, zo niet duizenden PHP-scripts, en door hun modulaire aard kan elke pagina-aanvraag tientallen tot honderden scripts laden. In tegenstelling tot sommige andere talen wordt PHP tijdens runtime geïnterpreteerd, wat betekent dat het script elke keer opnieuw in bytecode wordt vertaald. Hier komt APC van pas: APC kan een gecompileerde kopie van het script in het geheugen opslaan en direct gebruiken, wat de hoeveelheid benodigde middelen voor Drupal aanzienlijk vermindert. (Ter vergelijking: in talen zoals Python wordt een script automatisch gecompileerd en de bytecode naast het oorspronkelijke script opgeslagen, zodat de server dit later direct kan gebruiken.)
APC instellen is eenvoudig. Eerst moet je het installeren:
sudo apt-get install php-pear
sudo apt-get install php5-dev apache2-prefork-dev build-essential
sudo pecl install apc
Nu moet je het bestand apc.php (dat ik bij de les heb toegevoegd) naar de server kopiëren en daarna Apache herstarten:
sudo /etc/init.d/apache2 restart
Daarna kun je het bestand openen via http://test/apc.php en de APC-statistieken bekijken.
De statistieken zullen er ongeveer zo uitzien. Zoals je ziet, is het aantal cache-misses (MISS) hoog en het aantal cache-hits (HITS) laag. Ook is de fragmentatie van de bestanden in het APC-geheugen hoog. Dit duidt op een inefficiënt gebruik van APC. De oorzaken hiervan kunnen zijn:
Onvoldoende geheugen: als je 8 MB voor APC hebt toegewezen maar je scripts 12 MB innemen, dan zal 8 MB niet genoeg zijn, waardoor er meer MISSes optreden.
Fragmentatie: zelfs als je 32 MB hebt ingesteld, maar je totale bestanden 40 MB innemen, kunnen zelden gebruikte modules ruimte bezet houden in het cachegeheugen, terwijl actieve bestanden niet genoeg ruimte krijgen. Grote bestanden kunnen ook in fragmenten worden opgeslagen, wat gaten in het geheugen veroorzaakt.
Laten we nu de configuratieopties van APC bekijken. Het configuratiebestand bevindt zich in Debian/Ubuntu in /etc/php5/conf.d/apc.ini:
apc.enabled=1
Schakelt APC in. Een eenvoudige maar belangrijke instelling. Het uitschakelen van APC kan leiden tot prestatieverlies op een productieomgeving.
apc.shm_segments=1
apc.shm_size=32
Deze parameters bepalen hoeveel geheugen aan APC wordt toegewezen. apc.shm_segments=1
geeft aan dat er één geheugensegment is, en apc.shm_size=32
stelt de grootte van dit segment in op 32 MB. Je kunt dit verhogen naar bijvoorbeeld 64 MB en Apache opnieuw starten. Als het aantal MISSes nog steeds hoog is, verhoog het dan tot 128 MB, enzovoort. Dit is waarschijnlijk de belangrijkste instelling voor APC-prestaties.
apc.cache_by_default=1
;apc.filters=
APC wordt toegepast op alle PHP-scripts. Je kunt de regel met apc.filters
uitcommentariëren.
apc.cache_by_default=0
apc.filters="+drupal6"
Op deze manier kun je APC beperken tot alleen Drupal 6-bestanden. Dit is handig wanneer je bijvoorbeeld wilt voorkomen dat PhpMyAdmin-bestanden de cache beïnvloeden.
apc.stat=1
Deze parameter heeft direct invloed op de prestaties. Wanneer deze is ingeschakeld, blijft de cache in het geheugen totdat deze handmatig wordt geleegd. Wanneer uitgeschakeld, vergelijkt APC de wijzigingstijd van een bestand en vernieuwt het de cache bij een update. Op productieomgevingen moet deze optie aan staan, maar voor ontwikkelomgevingen is het beter deze uit te schakelen. Wanneer apc.stat is ingeschakeld, moet je de APC-cache wissen na updates van modules of de Drupal-core.
apc.ttl=0
Deze instelling bepaalt na hoeveel seconden de cache wordt geleegd. Bij 0 wordt de cache nooit automatisch geleegd. We stellen deze dus op 0 in, omdat we niet willen dat belangrijke cachegegevens periodiek worden verwijderd (standaardwaarde is 7200, oftewel 2 uur).
apc.rfc1867=1
Schakel deze in om voortgangsbalken voor bestandsuploads via APC in Drupal te activeren.
apc.num_files_hint=2048
Deze instelling is nuttig als je meerdere Drupal-sites op dezelfde server hebt. Eén site kan meer dan 500 bestanden in de cache plaatsen. Door deze waarde te verhogen (standaard 1024), voorkom je dat de cachebestanden van verschillende sites elkaar overschrijven.
Na het wijzigen van de instellingen, vergeet niet de server te herstarten. Uiteindelijk zou je grafieken moeten zien die er ongeveer zo uitzien:
Let erop dat het aantal MISSes bijna nul is en de fragmentatie 0% bedraagt.