Image PHP redimensionner à la volée vs stocker des images redimensionnées
je suis en train de construire un site de partage d'image et je voudrais connaître les avantages et les inconvénients de redimensionner les images à la volée avec PHP et de faire stocker les images redimensionnées.
qui est plus rapide?
Qu'est-ce qui est le plus fiable?
Quel est l'écart entre les deux méthodes en termes de vitesse et de performance?
s'il vous plaît noter que de toute façon les images passent par un script PHP pour les statistiques comme les vues ou si hotlinking est autoriser etc... donc, ce n'est pas comme ça sera un lien direct pour les images, si j'opte pour stocker le redimensionnement des images.
j'apprécierai vos commentaires ou tout lien utile sur le sujet.
4 réponses
cela ressemble à une optimisation prématurée. Savez-vous combien d'utilisateurs de votre site/ combien de calcul grognement de votre serveur(s)? Utilisez l'option la plus simple (au niveau de la maintenance), c.-à-d. redimensionner à la volée, jusqu'à ce que la performance devienne un problème, puis trouvez à partir de là ce qu'il faut faire.
ce pourrait être une idée d'implémenter une sorte de mise en cache côté serveur de vos images rescaled, si elles sont susceptibles d'être frappées à plusieurs reprises, mais je ne pense pas que ce besoin étendre en ce qui concerne le pré-rendu explicite.
c'est absolument incomparable.
redimensionner des images à la volée, en fait, c'est comme lancer une attaque DoS sur votre propre serveur. Redimensionner une image nécessite plus de CPU et de RAM que de servir une requête habituelle au script php. C'est déjà un énorme impact sur la performance. Encore une habitude vignette étant pas seul, mais en nombre. Donc, tout en montrant seulement une page de galerie vous créez des douzaines de processus de charge lourde, l'augmentation de la charge du serveur par un facteur de dix ou plus.
test rapide et sale pour prouver mes paroles: Essayons de redimensionner l'image relativement petite, 1,3 mégapixel
$ /usr/bin/time --format="%MK mem %Es CPU time" /usr/bin/convert angry_birds_1280x800.jpg -resize 100x100 thumb.jpg
10324K mem 0:00.10s CPU time
il nous a fallu 0,1 s, donc, montrer 10 images en previews va dévorer une seconde entière de votre temps CPU. Tandis que la page de Galerie PHP correctement écrite prendra environ 0,01 S. Ainsi, avec votre redimensionnement à la volée, vous augmentez la charge du serveur d'un facteur de 100.
même avec mémoire. Chaque processus de redimensionnement mangera pas moins de 10M de mémoire (pour redimensionner un fichier image de 100k!) avec une somme totale de 100M. Alors que la limite de mémoire habituelle pour le script PHP est de 8M et il est rarement atteint.
ce sont les vrais nombres de la vie.
une chose un peu drôle liée à ce problème:
exactement le même utilisateur PHP qui jette facilement 10000s de cycles CPU en même temps être incroyable jalousie d'épargner 1 ou 2! Ce n'est pas une façon de parler, voici un exemple de ce dont je parle:
Une question similaire de quelqu'un, dont grande préoccupation en même temps dans la chose négligeable que différence de vitesse entre les constantes, les Variables ou les tableaux de variables . Et qui récemment rencontrer taille de mémoire autorisé épuisé problème , comme si un tel le désastre ne suffisait pas.
il y a des tonnes de questions et de réponses sur ce site, débattant de la différence de vitesse nanoseconde de n'importe quelle opération, répondu avec une dignité inépuisable, en faisant des tests de millions d'itérations pour montrer la différence tout à fait négligeable entre les opérations one-shot de plusieurs cycles CPU chacun.
et en même temps il y a des questions comme celle-ci-concernant énorme, la différence incomparable en termes de performance entre deux les approches, qui semble simplement égale à l'auteur.
C'est le problème avec L'utilisateur PHP moyen et ce site.
Les premiers n'ont aucune mesure pour distinguer les choses réelles des choses microscopiques.
Pourtant, ces derniers n'ont pas de mécanisme de contrôle de santé mentale pour les questions - chacun a répondu avec autant d'enthousiasme, même si deux questions sont en contradiction l'un avec l'autre (et les deux avec le bon sens).
redimensionnement Dynamique peut être coûteux (temps) en fonction de la taille initiale de l'image. Je l'ai fait dans les systèmes de production, mais quand j'ai le choix, je favorise fortement la mise en cache sur disque. Après tout, l'espace disque est bon marché, et le temps de chargement est tout sur le Web. Même si vous mettez simplement en cache les vignettes à une taille spécifique et que vous faites du redimensionnement dynamique partout ailleurs, vous pouvez réduire considérablement les temps de chargement des listes d'images de style galerie.
je vous conseille fortement de mettre vos images en cache, et de ne pas les redimensionner à la volée.
le redimensionnement des images est très intensif en CPU et consomme de la mémoire pour votre serveur.
si vous avez une galerie d'images qui va se dimensionner à la volée, la page va charger les images lentement, dire quelque chose comme 3-10 secondes, dépend de filesize original.
lors du redimensionnement il faut environ 3 octets pr pixel de votre mémoire. Donc, Si vous avez une image 1000x1000 à redimensionner, il faudra environ 3MB de mémoire. Si votre une de vos pages Web a beaucoup de ces images redimensionnez à la volée, disons 20, cela prendra environ 60 Mo de RAM de votre serveur. Peut-être pas, puisque la plupart des clients ne demandent que 4 images à la fois, mais 12 Mo est encore beaucoup pour une charge de page. Je n'évoluerais à la volée que si l'image source est inférieure à 100x100 px.
astuce: une grande lib pour l'échelle et l'économie de pouces est PhpThumb