Introduction
APC est la solution la plus simple pour optimiser les performances PHP.
Un script PHP doit être parsé, compilé et exécuté à chaque appel. APC permet de cacher les OPCode (structures de données en langage C), ce qui évite de parser et compiler le script à chaque appel.
Comment APC fonctionne-t-il ?
Lors du cycle de démarrage d’une requête, APC surcharge la fonction zend_compile_file() avec une fonction propre my_compile_file() :
- Si my_compile_file () ne trouve pas de correspondance au script exécuté dans son cache (par défaut, APC utilise MMAP), APC appellera la fonction zend_compile_file() pour compiler le script. Sinon on passe directement à l’etape 2 ;
- Les OPCode fournis seront ensuite stockés en mémoire partagée afin que les différents processus d’apache puissent les lire ;
- APC copie ensuite les OPCodes directement dans les processus mémoire d’apache, pour permettre à zend d’exécuter le code du script demandé.
IMPORTANT : le cache APC sera entièrement vidé lors d’un redémarrage du serveur apache.
Comment installer APC ?
Sous linux
Nous partons de principe que nous sommes sur une installation par defaut. Si ce n’est pas le cas, modifiez les commandes ci-dessous en conséquence.
Sur une dedian ou ubuntu il faut taper les lignes suivantes :
sudo apt-get install php-apc
Vérifiez que le fichier /etc/php5/conf.d/apc.ini existe. Tapez la commande suivante :
sudo vi /etc/php5/conf.d/apc.ini
Vérifiez que la ligne suivante est bien présente :
extension=apc.so
Si ce n’est pas le cas ajoutez-la dans le php.ini dans la partie Dynamic Extensions :
sudo vi /etc/php5/apache2/php.ini
Ensuite il faudra modifier le fichier apc.ini ou php.ini :
sudo vi /etc/php5/conf.d/apc.ini sudo vi /etc/php5/apache2/php.ini
En fin de fichier ajoutez les lignes suivantes :
[APC] apc.enabled=1
Ensuite tapez la ligne de commande suivante :
sudo /etc/init.d/apache2 restart
Sous windows
Si vous avez une installation de type wamp ou autre, la librairie ne fait surement pas partie de votre package.
Pour l’obtenir, allez sur le site suivant :
http://dev.freshsite.pl/php-accelerators/apc.html
Ou sur le site
http://downloads.php.net/pierre/
Récupérez la version correspondant à votre php ainsi qu’à votre windows .
Apres avoir dezippé votre dll, renommez-la en php_apc.dll
Copiez ensuite la dll dans le répertoire des extensions. Exemple pour wamp, vous trouverez les extensions dans le répertoire [path_to_wamp]\bin\php\php5.x.x\ext
Lancez wamp pour prendre en compte votre librairie apc.
Désormais, il devrait apparaitre dans les extensions wamp.
Cochez l’extension php_apc.
Editez le fichier php.ini et ajouter les lignes suivantes en fin de fichier :
[APC] apc.enabled=1
Redémarrez le serveur apache pour prendre en compte les dernières modifications.
Comment vérifier qu’APC est bien installé ?
Il suffit tout simplement d’afficher un phpinfo. Vous devriez voir le module apparaitre comme ci-dessous :
Comment configurer APC ?
La documentation officielle (http://fr.php.net/manual/fr/apc.configuration.php) précise que la configuration APC par défaut est suffisante pour la plupart des installations.
Cependant, il y a deux paramètres à ajuster avec attention : apc.shm_size et apc.stat
apc.shm_size et apc.stat
- apc.shm_size : ce paramètre correspond à la taille allouée pour la mémoire partagée. Cette directive est par défaut à 32M, ce qui est trop peu, augmentez-la à 128M ou 256M, voire 512M si vous constatez une fragmentation trop importante ou une utilisation mémoire de vos caches à 100% ;
- apc.stat : ce paramètre vérifie si les fichiers sont modifiés ou non avant d’utiliser le cache. Par défaut, cette directive est à 1. Si vous la passez à 0, aucun contrôle ne sera fait, et apc utilisera directement son cache, que le fichier soit modifié ou non. Le seul moyen de forcer APC à vérifier que des fichiers sont mis à jour, sera de redémarrer le serveur web ou de vider les caches via l’interface APC.
Fortement conseillé pour les serveurs de production qui ont peu de mises à jour, et a contrario fortement déconseillé pour les serveurs de développement/intégration.
Prise en compte d’une directive par apc
Pour configurer une directive, il suffit simplement d’ajouter dans le php.ini ou dans apc.ini le nom de la directive avec sa valeur ; par exemple :
[APC] apc.enabled=1 apc.shm_size=256 apc.canonicalize=1 apc.ttl=0 apc.user_ttl=0 apc.rfc1867=1 …
Puis il suffit de redémarrer le serveur apache afin que vos directives soient prises en compte.
Quelques directives intéressantes
apc.canonicalize : permet de convertir tous les chemins relatifs que PHP va utiliser en chemins absolus
apc.ttl : nombre de secondes pendant lesquelles le cache sera conservé, avant d’être régénéré à nouveau. Par défaut cette directive est à 0.
apc.write_lock : si vous avez un serveur avec de nombreux utilisateurs, apc peut compiler plusieurs fois le cache d’un même script. Cette directive permet donc de garantir qu’un seul processus compilera un script, les autres processus utilisant le même script n’utiliseront pas le cache au lieu d’être placé en file d’attente. Par défaut, cette directive est à 1
include_once_override : Directive expérimentale qui surcharge les fonctions include_once et require_once afin d’optimiser ces appels. A tester à vos risques et périls, d’après la documentation officielle à ce jour… Cependant si vous ne constatez pas d’effet de bord, vous pouvez gagner en performance.
apc.rfc1867 : gestionnaire de progression de téléchargement.
apc.num_files_hint : permet d’optimiser votre utilisation mémoire, en indiquant le nombre de fichiers distincts à mettre en cache. Vous ne pourrez pas configurer cette variable sans avoir laissé votre serveur tourner en production pendant un temps significatif. Par défaut elle est à 1000. Mettre 0 si vous avez un doute, ou patientez quelques temps pour augmenter ou diminuer cette valeur.
Comment installer la page d’administration APC ?
Sous linux , vous trouverez une page d’administration ici : /usr/share/doc/php-apc/apc.php
Il suffit de la copier sur votre serveur web :
sudo cp /usr/share/pear/apc.php.gz path/to/src/apc.php.gz sudo gunzip /path/to/src/apc.php.gz sudo vi /path/to/src/apc.php
Et de modifier ces deux lignes :
defaults('ADMIN_USERNAME','apc'); // Admin Username defaults('ADMIN_PASSWORD','password'); // Admin Password - CHANGE THIS TO ENABLE!!!
Désormais la page est accessible . Par exemple : http://localhost/apc.php
Pour vider les caches apc sans redémarrer le serveur, connectez vous en cliquant sur login, puis cliquez sur Clear opcode Cache.
Dans l’exemple ci-dessous, vous constatez que ce serveur dédie 256Mo en cache APC ce qui parait suffisant (il reste 87.8 Mo)
Les pages sont cachées à 100% (100% de Hits).
Si vous avez de nombreux « misses » et si la mémoire est utilisée à 100%, il faut augmenter votre valeur apc.shm_size :
Mon avis
APC est très simple à installer. La configuration, une fois maitrisée, est également simple à mettre en œuvre. Les gains en performance sont tout de suite visibles. Donc mangez-en ! 🙂
C’est un outil qui permet rapidement de réduire des temps de réponses du serveur web, sans installation compliquée.
Pour les sites développés sous drupal, l’utilisation d’apc nécessite le module https://drupal.org/project/apc, il faudra penser à modifier votre fichier de configuration en conséquence (voir http://drupalcode.org/project/apc.git/blob_plain/refs/heads/7.x-1.x:/README.txt ).