Lorsque vous développez un projet PHP et que vous remarquez qu'un processus est long, c'est probablement le moment de considérer à optimiser la performance en utilisant la mémoire cache. Ceci aura pour effet de retenir pendant un certain temps le résultat du processus et de le réutiliser sans avoir à le reconstruire à chaque fois.
Par exemple, imaginez que vous avez un formulaire où le visiteur doit choisir son pays à l'aide d'une liste déroulante. Cette liste pourrait provenir de la base de données qui retournerait environ 200 résultats. Ce n'est pas volumineux en terme de quantité mais comme on sait qu'il y a peu de chance que cette liste soit modifiée fréquemment, on pourrait la placer en cache pour réduire le nombre d'accès à la base de données, ce qui constitue déjà une amélioration notable. À raison de 1000 visiteurs par jour, seul le premier subira l'attente et les suivants bénéficieront de la version cachée. Ensuite, le résultat pourrait expirer au bout de 24 heures et serait regénéré à nouveau le lendemain.
Pourquoi ne pas tout simplement faire une liste statique me direz-vous ? Effectivement, si votre projet est simple, ce n'est pas nécessaire d'utiliser APC. Par contre, si la liste des pays est obtenue à partir d'une requête SQL qui cumule de façon distincte les pays entrés dans les fiches de 5 millions d'entreprises qui doivent respecter des filtres spécifiques accessibles par des jointures à des tables de références, c'est possible que la requête s'exécute pendant quelques secondes. Pour éviter de faire attendre le visiteur à chaque chargement de page, on peut faire le choix d'améliorer la performance au détriment de l'exactitude des données en temps réel (encore là, ce n'est qu'un exemple fictif pour illustrer mon propos, il existe plusieurs autres stratégies).
Pour en venir au code PHP, si l'extension APC (Alternative PHP Cache) est installée sur le serveur (voir php.ini ou phpinfo), vous pourrez tirer avantage de la mémoire cache. Vous verrez à quel point c'est simple. L'idée est d'assigner un nom/id unique à chaque donnée qu'on veut placer en mémoire cache. C'est à partir de ce tag qu'on pourra récupérer la donnée en mémoire, sinon on fera le travail pour la générer et on l'enregistrera sous ce nom unique.
// essai pour récupérer le contenu enregistréDans votre CMS, si vous vous rendez compte que des changements importants ont été apportés à la liste, vous pouvez forcer sa recompilation à la prochaine visite en supprimant l'élément en cache :
$recordset = apc_fetch('unique_id');
// non trouvé
if ($recordset === FALSE) {
// on récupère la liste par la base de données
$recordset = $conn->query('SELECT * FROM countries INNER JOIN ...');
// enregistrer le recordset pour 24 heures
apc_store('unique_id', $recordset, 86400); // en secondes
}
else {
// echo 'Récupéré dans la cache!';
}
// continuer normalement
foreach($recordset as $row){
// loop...
}
apc_delete('unique_id');Autre fait à noter, vous pouvez récupérer la variable en cache en tout temps et sur n'importe quelle page. Assurez-vous seulement de pouvoir la regénérer facilement si elle est expirée, par exemple en encapsulant le tout dans une fonction.
Autrement, si APC est manquant et que vous êtes dans l'impossibilité de le faire installer, je vous recommande de vous tourner vers Zend_Cache du Zend Framework qui fait l'équivalent mais qui n'est pas dépendant d'une extension externe. J'en parlerai dans les prochains jours.
Merci pour cette excellente explication!
Alouit-Multimedia