8
votes

La bibliothèque GD utilise-t-elle beaucoup de mémoire?

Je souhaite utiliser la bibliothèque GD dans mon script PHP pour générer une petite vignette d'une grande image aléatoire à partir de serveur externe. Chaque fois que la page est appelée, la bibliothèque GD régénérera une vignette et le montrera.

Cela ralentit-il le serveur ou utilisez-vous une quantité inhabituelle de mémoire?


1 commentaires

La régénération d'une vignette prend le temps de serveur. La seule façon de savoir si cela le rend "trop ​​lent" ou non pour l'essayer et voir. De plus, la "mémoire" et "vitesse" sont deux concepts entièrement différents.


6 Réponses :


1
votes

Bien sûr, il ralentira le serveur, cela dépend également de la taille de l'image que vous utilisez. Pourquoi ne pas simplement enregistrer la vignette-image?


0 commentaires

0
votes

Si vous générez une nouvelle vignette, chaque page de page, elle prendra du temps de traitement supplémentaire. En fonction de la quantité d'images que vous vigrirez ainsi que leurs tailles d'origine, vous pouvez remarquer ou ne pas remarquer la lenteur. S'il y a de toute façon, vous pouvez créer la vignette sur la première page chargée et enregistrez-la, puis chargez la version pré-créée pour d'autres charges de page, vous serez mieux éteint.


1 commentaires

Vous ne remarquerez peut-être pas la lenteur sur les tests, mais une option dynamique rendra la solution dérangeante non évolutive. Ce type de chose pourrait facilement apporter un serveur si le trafic augmenta même une quantité modérée, la mémoire sera rapidement utilisée et le serveur se tournerait vers l'échange, ce qui lui entraînerait d'apparaître à la plupart des utilisateurs à titre de ralentissement d'un rythme d'escargot.



7
votes

GD utilise beaucoup de mémoire. Il charge l'image dans la mémoire entièrement et le décompre, de sorte que vous aurez besoin d'au moins 32 bits par pixel. Une image avec la taille 800 x 600 utilise ensuite:

800 * 600 * 32 bits = 15,4 mégabit = 2 Mo

Ceci est seulement pour charger l'image. J'ai entendu dire qu'il utilisera le double de ceci si vous redimensionnez et si vos images sont encore plus grandes, ce sera encore plus de mémoire.

Vous devriez vraiment envisager de mettre en cache vos vignettes afin qu'elles doivent seulement être générées une fois (cela accélérera également la page pour vos visiteurs!).

Je lis également maintenant que vous chargez des images à partir d'un serveur externe, auquel cas vous devez vraiment mettre en cache l'image car sinon vos visiteurs doivent vous attendre pour télécharger l'ensemble de l'image en premier. Cela devient encore pire si le serveur externe est en panne ou surchargé et que vos visiteurs devront attendre un délai d'attente (cela ressemblera à ce que votre service est lent). En plus de cela, vous perdrez beaucoup de bande passante si vous téléchargez l'image à chaque fois qu'un utilisateur demande une vignette de celui-ci.


Puisque GD utilise tellement de mémoire, il peut s'agir de la peine de générer les vignettes à l'aide de l'extension imagick. Imagemagick fait échelle beaucoup mieux en ce qui concerne la consommation de mémoire et est également très rapide (mais vous devez toujours mettre en cache les images, pour les raisons indiquées ci-dessus).


2 commentaires

+1 pour "Imagemagick fait une échelle beaucoup mieux en ce qui concerne la consommation de mémoire" , c'est l'information clé que vous devriez avoir en gras! Vous pouvez supprimer le reste. :-)


La mise en cache est plus importante que le choix de l'outil de redimensionnement. ImageMagick présente des avantages (ne comptant pas la limite de mémoire de PHP, car elle appelle un processus externe) et des inconvénients (nécessite une installation de nombreuses bibliothèques, introduit probablement plus de risques de sécurité aussi, car il s'agit d'un grand paquet avec beaucoup plus de fonctionnalités que de redimensionnement.) Mais le Le choix du paquet va avoir un effet négligeable sur la charge de performance et du serveur par rapport au choix du cache vs. Générer dynamiquement. HD Space est bon marché et les vignettes sont petites: Toujours Cache.



1
votes

dépend de ce que vous faites avec cela, mais pourquoi ne pas essayer de vous-même:


0 commentaires

1
votes

Tout type de traitement d'image est susceptible d'être une mémoire intensive.

Si vous pouvez mettre en cache ces images afin de ne pas les régénérer à chaque coup de la page, ce serait un bon geste.

Une bibliothèque PHP qui traite de beaucoup de cette mise en cache pour vous est PHPTHumb - c'est probablement idéal pour des tâches comme celles-ci.

http://phpthumb.sourceforge.net/


0 commentaires

0
votes

Oui, c'est une idée terrible et entraînera rapidement votre serveur comme une augmentation de la circulation.

Le traitement de l'image utilise d'énormes quantités de ressources de serveur, de la CPU et de la mémoire. Par exemple, pour redimensionner un fichier JPG d'~ 600KB lorsque je l'ai testé récemment, il a fallu GD ~ 9 Mo de mémoire à l'usage de pointe. Vous pouvez mesurer cela en utilisant memory_get_peak_usage (true) . Si vous générez de manière dynamique les vignettes, ces ressources seront utilisées chaque fois qu'une page est demandée . En outre, étant donné que le redimensionnement est une opération lente, beaucoup plus lente que de servir un fichier, cette mémoire sera utilisée pour une durée importante, beaucoup plus longue qu'il faut généralement un script PHP à exécuter. Un nombre suffisant de demandes à la fois entraînera donc rapidement votre serveur de s'épuiser de la mémoire et de passer à Swap, ce que vous ne voudrez jamais avoir eu lieu, et cela entraîne généralement des temps d'arrêt visibles à la plupart des personnes qui consultent votre site.

Les vignettes sont petites. Par exemple, j'ai généré un pouce (encore assez grand, 640x480) de ce fichier et il n'a pris que 64 Ko. Les miniatures plus petites sont encore plus petites. L'espace HD est bon marché et vous ne stockez que le petit fichier de sortie, pas l'utilisation maximale. Si le fichier d'origine est sur votre serveur, l'espace requis en stockant plusieurs miniatures va être négligeable.

générer une fois et stocker c'est la seule option sane ici. Avec cette approche, vous n'engendez que le processeur élevé et l'utilisation de la mémoire une fois et vous obtenez tous les avantages de servir une petite vignette. En outre, si vous êtes intelligent, vous pouvez choisir lorsque vous devez inciter les coûts de traitement d'images lourds, par exemple en mettant des images non traitées dans une file d'attente, puis en attente d'un moment lorsque le serveur est relativement léger, et générer la vignette alors. Parfois, un retard de quelques secondes seulement conduit toujours à une bonne expérience utilisateur, mais évite l'appel "lourd" si le serveur connaît une pointe de la circulation pour le moment.


0 commentaires