Facebook LinkedIn SourceForge Twitter RSS LastFM
logologo

Estimer la consommation mémoire des ressources GD

Geoffray Warnants|13/11/2010|5 commentaires

La librairie GD forme aujourd'hui avec PHP un couple apprci des dveloppeurs web. Elle offre en effet un accs d'une grande simplicit aux traitements d'images, ces oprations obscures qu'on sait truffes de formules mathmatiques et autres transformations matricielles, et qu'on devine par consquent probablement gourmandes en ressources matrielles. Mais sait-on exactement jusqu' quel point ? Pour ma part non, jusqu' aujourd'hui...

Le graphique ci-dessous reprsente la quantit de mmoire vive consomme par un script lors de la cration d'une ressource GD en fonction des dimensions de l'image traite (ou plutt de sa dfinition pour tre exact)

Mmoire alloue par GD selon la dfinition de l'image (GD bundled v2.0.34)

Comme on pouvait s'en douter, la mmoire requise est proportionnelle au nombre de couleurs ainsi qu'aux dimensions de l'image. On peut donc envisager qu'un fichier suffisamment imposant puisse saturer compltement la mmoire libre, celle-ci n'tant pas illimite. Il en rsultera alors un arrt brutal du script caus par une erreur fatale (Fatal error: Allowed memory size of %d bytes exhausted (tried to allocate %d bytes)). Un sombre scnario qui, pour pouvoir tre vit, doit d'abord tre anticip.

L'objectif de cette tude est donc d'estimer les dimensions maximales approximatives acceptables selon la configuration mmoire en vigueur. J'insiste sur le caractre approximatif car j'ai pu constater qu' dfinition gale, la mmoire occupe par une ressource GD dpend aussi de ses proportions. Ainsi une image au format "portrait" (plus haute que large) risque de ncessiter d'avantage de mmoire que la mme au format "paysage". Heureusement cette diffrence ne concerne de manire significative que des images tires l'extrme.

Voici donc les dimensions maximales estimes pour des images au format 4/3 :

memory_limit imagecreatetruecolor imagecreate
64M 13 Mpx (~4162x3123) 32 Mpx (~6532x4899)
128M 26 Mpx (~5889x4415) 65 Mpx (~9308x6983)
256M 53 Mpx (~8406x6305) 128 Mpx (~13064x9798)
512M 106 Mpx (~11887x8917) 262 Mpx (~18689x14019)
1G 201 Mpx (~16372x12277) 514 Mpx (~26179x19634)

Ces valeurs permettent alors d'instaurer des vrifications adaptes aux contraintes mmoire en vigueur. Par exemple :

<?php
ini_set('memory_limit', '64M');
$size = getimagesize($filename);
if ($size===false || $size[0] > 4000 || $size[1] > 3000) {
    throw new Exception('Image too large');
}
$rc = imagecreatetruecolor($filename);

Notons ici que le choix de la fonction getimagesize n'est pas anodin : elle permet d'obtenir les dimensions du fichier sans le charger entirement en mmoire, ce qui n'est pas le cas par exemple de ses homologues imagesx et imagesy qui risquent de provoquer la saturation mmoire avant mme d'avoir pu s'en prmunir...

Conclusion

La consommation mmoire des ressources GD n'est finalement pas si excessive. Les configurations standards permettent dj de manipuler des images importantes sans soucis. Evidemment, je ne vous apprends rien en rptant que tout fichier externe doit tre considr comme une source de donnes potentiellement risque, ce qui est d'autant plus vrai pour les images reues par exemple au travers d'un formulaire d'upload, et qu'elles doivent donc toujours faire l'objet d'un contrle minutieux avant d'tre manipules. Car une gestion correcte de la mmoire est avant tout du bon ressort du programmeur.

<<< Retour

Vos commentaires

5 commentaires posts

Candice Gautier
28/12/2020 20:11Post par Candice Gautier
Je suis un d?veloppeur Web d?butant. Du coup, je ne connais pas ce couple de GD et PHP. Mais je suis d?j? famili?re avec les outils indispensables pour parfaire sa performance, ? l?instar de DevTools, Visual Studio Code?
Miriam Cordier
21/12/2020 08:57Post par Miriam Cordier
Le traitement d?image est une discipline purement informatique et math?matique. Donc, il faut avoir une base solide de ces derniers si on veut connaitre son fonctionnement. Perso, je ne connais que le traitement des images multicanaux.
Lina Durand
09/12/2020 02:30Post par Lina Durand
À mon avis, il faut être un informaticien spécialisé en programmation ou être un matheux pour comprendre votre article. Surtout, en ce moment, le nombre de logiciels ou d?application à apprendre ne cesse pas d?augmenter.
Karen Denis
12/10/2020 15:47Post par Karen Denis
La librairie GD est prise en charge à partir de la version 4.3 de PHP et elle permet de réussir des exploits remarquables au niveau de la manipulation d?images. Je ne sais pas si ça a toujours été le cas, notamment du temps de cet article.
Victoria Simon
03/09/2020 15:11Post par Victoria Simon
Malgré le fait que votre article soit un peu vieux, je trouve que votre idée va aider de nombreux internautes. Je ne connais rien en informatique, mais j?ai envie de m?intégrer dans votre blog qui se concentre dans ce domaine.

Ragir cet article

*


(Ne sera pas publie, servira uniquement afficher votre gravatar)


(Lien en dur et dofollow)

zend framework