Aller au menu - Aller au contenu

Accélérer la génération de vos pages PHP avec l'extension APC


Informations sur le tutoriel

Avatar
Auteur : Nanocom
Difficulté : Intermédiaire
Temps d'étude estimé : 30 minutes
Visualisations : 64 249
Licence : Creative Commons BY-NC-SA


Plus d'informations Plus d'informations

Historique des mises à jour

  • Le 13/02/2010 à 17:52:15
    Coquille dans un code
  • Le 13/02/2010 à 15:22:40
    Mise à jour d'informations et correction de plusieurs détails
  • Le 04/08/2009 à 11:39:00
    Correction d'un lien mort
Ce tutoriel présente rapidement le moyen le plus simple d'accélérer la génération de ses scripts PHP : le "cache d'OPCodes".

Nous verrons comment installer l'extension APC de PHP et comment la configurer, et nous découvrirons son "cache utilisateur".

La plupart des hébergements mutualisés ne proposent pas cette extension ( :( ). Si vous voulez l'utiliser, il vous faut soit demander à votre hébergeur de l'installer, soit disposer de votre propre serveur dédié.

Présentation de l'extension APC

L'extension APC (Alternative PHP Cache) est un système de cache avancé permettant d'accélérer la génération de vos pages PHP et une économie de travail sur le serveur. C'est ce que l'on appelle un cache d'OPCodes.

Pour faire simple, l'OPCode est le code intermédiaire compilé par PHP pour exécuter vos pages. Un cache d'OPCodes permet donc de ne plus rendre systématique cette phase de compilation en lui fournissant une page PHP déjà compilée et stockée dans la mémoire vive (RAM) de votre serveur.

Par exemple, admettons que j'exécute ce code :

Code : PHP
1
2
3
4
<?php
$variable = 'BONJOUR';
echo $variable;
?>


L'OPCode généré ressemblera à quelque chose du genre :

Code : Autre
1
2
ASSIGN !0, 'BONJOUR'
ECHO   $0


Puisque la mémoire vive d'un ordinateur est vidée lorsqu'on l'éteint, le cache stocké par APC sera vidé à chaque redémarrage du serveur.


En plus de mettre en cache l'OPCode de vos pages, APC fournit un "cache utilisateur" présenté dans la dernière partie de ce tuto.

Cette extension n'est pas intégrée nativement à PHP, voyons donc maintenant comment l'installer et la configurer sur votre serveur.

Installation sous Linux

Ce tutoriel a été testé sous Ubuntu 9.10 et devrait fonctionner pour les versions antérieures.

Commencez par entrer cette commande :

Code : Console
sudo apt-get install php5-dev php-pear apache2-prefork-dev


Les paquet php5-dev et apache2-prefork-dev fournissent une partie des sources de PHP et d'Apache nécessaires pour compiler des modules additionnels. Le paquet php-pear nous permettra lui d'installer APC.

Ensuite, pour éviter un bug durant l'installation d'APC (je n'entre pas dans les détails ici, l'essentiel est que ça marche), entrez cette commande :

Code : Console
sudo ln -s /usr/bin/apxs2 /usr/bin/apxs


Vous pouvez maintenant installer l'extension, tout simplement en exécutant cette commande :

Code : Console
sudo pecl install apc


L'installateur commence par télécharger les sources d'APC, puis vous demande :

Code : Console
Use apxs to set compile flags (if using APC with Apache)? [yes] :


Tapez simplement Entrée, le choix par défaut étant "yes".

Il se peut que la question demandée ne soit pas la même au cours de votre installation, dans tous les cas tapez Entrée, la configuration par défaut fonctionnant bien en général.

Ensuite, l'installateur compile les sources d'APC puis les installe.

Une fois l'installation terminée, et comme indiqué lors de l'installation, vous devez modifier le php.ini pour activer l'extension : le php.ini se trouve par défaut dans /etc/php5/apache2/php.ini.

Ouvrez donc ce fichier en mode administrateur avec votre éditeur de texte préféré.
Pour les novices, tapez :

Code : Console
sudo gedit /etc/php5/apache2/php.ini


ou pour ceux qui n'ont pas gedit :

Code : Console
sudo nano /etc/php5/apache2/php.ini


Et cherchez l'endroit du fichier où il est écrit Module settings.

Juste avant ce Module settings, écrivez extension=apc.so : cela permet d'indiquer à Apache qu'il doit utiliser cette extension.

Et juste après le Module settings, écrivez

[APC] apc.enabled=1


Vous devez donc avoir un php.ini qui ressemble à ça :

Image utilisateur


Redémarrez apache (en entrant la commande /etc/init.d/apache2 restart) et faites un phpinfo() ; vous devriez voir ces informations affichées quelque part :

Image utilisateur


Si c'est le cas, l'extension est bien installée et activée.

Vous pouvez donc passer à la phase de configuration, décrite ci-après.

Installation sous Windows

Pour installer l'extension sous Windows, c'est un poil compliqué : avant, on pouvait récupérer le fichier dll directement sur le site de PHP dédié (pecl4win.php.net), mais celui-ci est fermé depuis pas mal de temps. Maintenant, il faut se débrouiller pour trouver la DLL sur internet. Un développeur de PHP fournit heureusement une page de téléchargement d'extensions PHP précompilées pour windows : http://downloads.php.net/pierre/.

Sur ce site, on vous propose plusieurs liens pour APC. Vous devez choisir le bon fichier en fonction de votre version de PHP (par exemple, php_apc-3.0.19-5.2-Win32-VC6-x86.zip est une version d'APC pour PHP 5.2). Je ne vous conseille pas de fichier en particulier, étant donné que cette page est amenée à changer régulièrement. Essayez donc de trouver un fichier qui colle, et si ça ne fonctionne pas plus loin, essayez avec un autre fichier.
Ensuite, copiez ce fichier dans le dossier contenant les extensions de PHP.
Si vous êtes sous WAMP, vous pouvez y accéder en allant dans son dossier d'installation. Pour ce faire, allez dans le dossier www, accédez au dossier parent, puis rendez-vous dans le dossier bin/php/php-5.x.x/ext/.


Ensuite, rendez-vous dans votre fichier de configuration php.ini : si vous utilisez WAMP, faites un clic gauche sur l'icône dans la barre des tâches, survolez PHP, et cliquez sur php.ini.

Cherchez l'endroit du fichier où les extensions sont activées, et mettez-vous juste à la dernière ligne avant Module Settings. Cela ressemble à ça :

php.ini


Ecrivez ceci :
Code : Autre
1
extension=php_apc.dll


Puis écrivez ceci juste en dessous du Module settings :

Code : Autre
1
2
[APC]
apc.enabled=1


Vous venez d'activer l'extension.

Maintenant, redémarrez tous les services, et faites un phpinfo() : vous devriez voir affiché quelque part ces informations :

Image utilisateur


Si c'est le cas, l'extension fonctionne !

Vous pouvez maintenant passer à la phase de configuration.

Configuration de l'extension

Configurons maintenant votre extension APC fraîchement installée.
La documentation PHP sur APC nous dit que :

Citation : Documentation PHP
Il y a deux décisions importantes que vous devez faire. D'abord, la quantité de mémoire partagée que vous voulez allouer à APC et ensuite, si vous voulez qu'APC vérifie si un fichier a été modifié à chaque demande.


Vous devez donc décider de combien de mémoire vive dispose l'extension. Pour la définir, rendez-vous dans votre php.ini à l'endroit où vous avez écrit apc.enabled=1, et écrivez à la suite :

Code : Autre
1
apc.shm_size={mémoire en MB}


La taille par défaut est de 30 Mo : je vous conseille de l'augmenter. Tout dépend de la RAM dont vous disposez sur votre serveur, mais si vous en avez beaucoup, vous pouvez mettre plus de 100 Mo sans problème.

La seconde option à paramétrer permet de définir si APC doit vérifier à chaque génération de page que la page PHP mise en cache n'a pas changé : le paramètre à définir est apc.stat :

Citation : Documentation PHP
Par défaut, APC vérifie le script à chaque demande pour voir s'il a été modifié ou non.
S'il a été modifié, il sera compilé à nouveau et la nouvelle version sera mise en cache.
En désactivant cette option, aucune vérification n'aura lieu. Cela signifie que si vous voulez activer les modifications, vous devez redémarrer le serveur web.
Sur un serveur de productionvous modifiez rarement le code, le fait de désactiver cette option permet de gagner en performances de manière significative.


Je n'aurais pas mieux dit :) . En gros, si vous modifiez très régulièrement votre code, mettez un apc.stat=1. Si vous êtes sur un serveur de production et que vos pages PHP sont modifiées peu souvent, mettez 0, cela améliorera les performances.

Votre php.ini doit donc ressembler à peu près à ceci :

Code : Autre
1
2
3
4
[APC]
apc.enabled=1
apc.shm_size=128
apc.stat=1


Je vous laisse découvrir comme des grands les autres options de configuration d'APC dans la doc de PHP. Ces options sont facultatives, mais il se peut que vous en ayez besoin un jour.

Vous pouvez aussi obtenir plusieurs informations sur l'extension en téléchargeant la dernière version d'APC, et en mettant sur votre serveur web la page apc.php située dans l'archive que vous venez de télécharger : vous pourrez ainsi voir la quantité de mémoire utilisée et disponible pour l'extension, ainsi que plusieurs autres informations pratiques.

Le cache utilisateur

Le cache utilisateur est un des gros points fort de l'extension APC.

Vous devez normalement savoir que pour mettre en cache une information en PHP, on utilise généralement un fichier .txt : ce type de fichier est stocké sur le disque dur, le temps d'accès au fichier est donc relativement long.

APC, lui, permet de mettre en cache des variables directement dans la mémoire vive de votre serveur, ce qui offre des temps d'accès à l'information beaucoup plus faibles, vos scripts s'exécutent donc plus rapidement si vous l'utilisez :) .

Son utilisation est très simple, vous disposez en effet de trois fonctions : apc_add, apc_fetch, et apc_delete.

La première permet de mettre en cache une variable dans la RAM ; la deuxième, de récupérer une valeur mise en cache précédemment ; et la troisième, d'en supprimer une.

Exemple :

Code : PHP
1
2
3
4
5
6
7
8
<?php

$nombreMembres = 200000; // Par exemple, le nombre de membres du site
apc_add('nombreMembres', $nombreMembres); // On met en cache la variable
echo apc_fetch('nombreMembres'); // Affiche 200000
apc_delete('nombreMembres'); // On supprime la variable du cache (facultatif)

?>


En bonus track pour les utilisateurs de POO (à modifier selon vos besoins), la structure générale d'une classe gérant le cache APC :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

class APCCache {
	
	public static function store($key, $var, $destruct = false)
	{
		if ($destruct) {
			return apc_store($key, $var);
		} else {
			return apc_add($key, $var);
		}
	}
	
	public static function get($key)
	{
		return apc_fetch($key);
	}
	
	public static function delete($key)
	{
		return apc_delete($key);
	}

	public static function cacheInfo() // Retourne des informations sur le cache utilisateur
	{
		return apc_cache_info();
	}

	public static function clear() // Efface les données mises en cache
	{
		return apc_clear_cache('user');
	}

}

?>


La différence entre apc_add() et apc_store() réside dans le fait que apc_add() met la variable en cache uniquement si elle ne s'y trouve pas déjà, alors que apc_store() écrase les éventuelles données mises en cache précédemment.

Concernant la fonction apc_cache_info(), je vous laisse la découvrir dans la doc de PHP.

Le temps de génération de vos pages devrait maintenant décroître significativement sur votre site, vos scripts étant mis en cache dans la RAM de votre serveur.
À noter que PHP6 devrait intégrer un tel système de cache nativement.

Liens

Pour finir, il existe d'autres systèmes semblables (par exemple eAccelerator et xCache), qui ont des performances comparables.

Informations sur le tutoriel

Retour en haut Retour en haut

Créé : Le 19/11/2008 à 11:42:29
Modifié : Le 13/02/2010 à 17:52:14
Avancement : 100%

L'orthographe, la grammaire et la présentation de ce tutoriel ont été vérifiées par les zCorrecteurs.
29 commentaires