PRATIQUE PHP 
Gérer au mieux la mémoire avec PHP
 
"Mon serveur atteint assez rapidement ses limites en matière de RAM, existe-t-il des tactiques pour en utiliser le moins possible ?" (06/01/2006)
  Forum

Réagissez dans les forums de JDN Développeurs

Même si le prix du matériel est constamment en baisse, tous les serveurs Web ne disposent pas de 1 Go de mémoire pour réaliser toutes les envies de leurs propriétaires - loin de là. Si les petits scripts du quotidien sollicitent peu la RAM, il en va autrement des traitements plus lourds. L'usage est de surcroît démultiplié par le nombre de requêtes - et/ou le nombre de clients s'il s'agit d'un serveur mutualisé.

PHP reste cependant un langage bien conçu et bien optimisé. La plupart des optimisations pourront s'effectuer côté serveur (configuration Apache par exemple), mais certains aspects du code peuvent profiter de modifications pour abaisser l'usage mémoire. Voici quelques idées en la matière.

L'une des plus courantes est le passage par référence plutôt que par valeur (lire notre article du 20/02/04). Les références ne sont évidemment pas la réponse ultime ni un remplaçant obligatoire aux valeurs pour qui veut gérer sa mémoire, mais chaque approche a ses qualités. On ne verra par exemple que peu de différence entre les deux méthodes si les données passées sont d'un type simple (chaîne, entier, booléens...).

En revanche, les fonctions qui traitent des types plus complexes, comme des tableaux et/ou des objets, peuvent gagner à les passer par référence. Il faut cependant noter que depuis PHP5, les objets sont automatiquement passés par référence - de fait, la gestion des références a été largement retravaillée, notamment dans son usage mémoire.

Libérez bien entendu les variables qui ne seront plus utilisées à l'aide de unset(). Également, faites en sorte que les cas les plus courants/plausibles d'une instruction switch() soient en première position, même s'il s'agit du cas par défaut.

Les aficionados de la récursivité (lire notre article du 09/05/03) devraient toujours s'assurer que leur code est utile à tous les stades. Il est en effet facile de se laisser entraîner, ou d'oublier de remettre à zéro une valeur inutile, ou encore, tout simplement, d'obtenir une boucle sans fin sans le savoir - ce qui augmente l'usage mémoire rapidement.

Les fonctions d'inclusion (include_once et require_once) sont également à surveiller. Il est préférable de regrouper ses inclusions en un même endroit plutôt qu'elles s'enchaînent entre fichiers inclus consécutifs. En effet, chaque fichier inclus provoque une nouvelle interprétation, principale consommatrice de mémoire.

Plus généralement, et par extension à ce que nous venons d'écrire, un excellent moyen de garder son usage mémoire à un niveau bas est de faire appel à une solution de cache, particulièrement dans le cas où vos pages changent peu (même toutes les heures). Les pages cachées ne sont logiquement pas interprétées, et c'est un soulagement pour le serveur. Un cacheur d'opcode ou même un simple usage de ob_start() en début de fichier PHP peuvent se révéler salvateurs.
 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page