Service D'Images avec redimensionnement à la volée
ma société a récemment commencé à avoir des problèmes avec le traitement d'image pour nos sites web.
nous avons plusieurs sites Web (divertissement pour adultes) qui affichent des images comme des couvertures de dvd, des instantanés et similaires. Nous avons environ 100'000 films et pour chaque film, nous avons une moyenne de 30 instantanés + couvre. Presque toutes les images ont une version supplémentaire avec flou et superposition pour les non-membres, ce qui donne environ 50 images par film ou un total de 5 millions d'images de base. Chacune des images est disponible en plusieurs versions, selon l'endroit où elle est placée sur la page (vignette, original, petit aperçu, pas si petit aperçu, petite image dans la liste supérieure, etc.) ce qui donne plus d'images que je n'ai pu compter.
Maintenant, j'ai eu l'idée d'utiliser un serveur pour générer les images à la volée depuis qu'il est devenu assez maladroit pour générer toutes les images différentes pour les différentes pages (pages différentes, parfois même besoin de différentes tailles d'image pour fondamentalement, la même tâche).
est-ce que quelqu'un connaît un serveur de traitement d'image qui peut réduire l'échelle des images à la volée donc nous avons seulement besoin de fournir les images originales et les gars du web peuvent juste demander quelle taille ils ont besoin?
Requirements:
- Très Haute performance (Plusieurs milliers d'utilisateurs par jour)
- À la volée le flou et la superposition de la création
- redimensionner à la volée (avec et sans garder les proportions)
- peut traiter des millions d'images
- Doit être capable de lire les formats JPG, GIF, PNG et BMP, et convertir entre eux
la sécurité n'est pas tellement une préoccupation car i.e. les images non bloquées peuvent déjà être atteintes par la manipulation D'URL et plus de sécurité serait bien, mais ce n'est pas nécessaire et franchement j'ai cessé de m'en occuper (après avoir échoué à entrer dans Mes têtes de collaborateurs pourquoi (pour nos petites page revendeur) c'est une mauvaise idée d'utiliser http://example.com/view_image.php?filename=/data/images/01020304.jpg pour afficher les images).
nous avons essayé des scripts PHP pour faire cela, mais la performance était trop lente pour ces nombreux utilisateurs.
Merci d'avance pour toutes vos suggestions.
8 réponses
je vous suggère de configurer un serveur web dédié pour gérer l'image Redimensionner et servir le résultat final. J'ai fait quelque chose de similaire, mais sur une échelle beaucoup plus petite. Il élimine essentiellement le processus de vérification de la cache.
ça marche comme ça:
- vous demandez l'image en ajoutant la taille requise au nom du fichier comme
http://imageserver/someimage.150x120.jpg
- si l'image existe, elle ne sera pas retournée traitement (c'est le point principal, la vérification du cache est implicite)
- si l'image n'existe pas, gérer le 404 non trouvé via .htaccess et rediriger la requête vers le script qui génère l'image de la taille requise
- dans le script spécifiez la liste des tailles autorisées pour éviter les attaques comme les scripts demandant toutes les tailles possibles pour fermer votre serveur
- gardez ceci sur un domaine sans cookie pour minimiser le trafic inutile
EDIT: Je ne pense pas que PHP lui-même pourrait ralentir le processus beaucoup, comme PHP scripting dans ce cas est réduit au minimum: l'échelle de l'image est fait par une bibliothèque intégrée écrite en C. quoi que vous fassiez, vous aurez à utiliser une bibliothèque comme ceci (GD ou libmagick ou Ainsi) donc c'est inévitable. Avec mon système au moins vous sautez totalement la vérification du cache, réduisant ainsi encore plus L'interaction PHP. Vous pouvez implémenter cela sur votre serveur existant, donc je suppose c'est une solution bien adaptée pour votre budget.
D'après
nous avons essayé des scripts PHP pour faire cela, mais la performance était trop lente pour ces nombreux utilisateurs.
je suppose que vous ne cachiez pas les résultats. Je recommande de mettre en cache les images résultantes pendant un jour ou deux (c'est-à-dire de faire vérifier votre script pour voir si la vignette a déjà été générée, si c'est le cas, utilisez-la, si elle ne l'a pas générée à la volée).
cela améliorerait la performance de façon dramatique comme j'imagine que la page principale/page de départ a probablement beaucoup plus de hits que la vidéo x aléatoire, donc lors de la visualisation de la page principale aucune image ne doit être créée car ils sont mis en cache. Quand L'utilisateur Y regarde Movie X, il ne remarquera pas le retard autant qu'il n'a qu'à générer cette page.
pour l'aspect" redimensionner à la volée " - Quelle est l'importance de la bande passante pour vous? Je voudrais supposer que vous traversez tellement de films que quelques kb supplémentaires en images par demande ne seraient pas faire trop de mal. Si c'est le cas, vous pouvez simplement utiliser des images plus grandes et définir la largeur et la hauteur et laisser le navigateur faire la mise à l'échelle pour vous.
Le ImageCache et Image taille Exacte les solutions de l' Drupal communauté pourrait le faire, et comme la plupart des solutions OSS utiliser les bibliothèques de ImageMagik
il y a quelques images AMI pour Amazons EC2 service pour faire l'échelle de l'image. Il utilisait Amazon S3 pour le stockage d'images, l'original et les balances, et pouvait les alimenter à travers le service Amazons CDN (Cloud Front). Vérifier sur EC2 site pour ce qui est disponible
une autre option est Google. Google docs prend désormais en charge tous les types de fichiers, de sorte que vous pouvez charger les images dans un dossier Google docs, et partager le dossier pour un accès public. Les URL sont un peu longues par exemple
ajouter le paramètre =s pour dimensionner l'image, cool! par exemple, pour 200 pixels de large
Google charge seulement USD5 / an pour 20 Go. Il existe une API complète pour le téléchargement de docs etc
autres réponses sur SO "comment redimensionner au mieux les images hors-serveur
Ok le premier problème est que redimensionner une image avec n'importe quel langage prend un peu de temps de traitement. Comment soutenez-vous des milliers de clients? Nous allons le mettre en cache pour que vous n'ayez à générer l'image qu'une seule fois. La prochaine fois que quelqu'un demande cette image, vérifiez si elle a déjà été générée, si elle vient de la retourner. Si vous avez plusieurs serveurs app, alors vous voudrez mettre en cache vers un système de fichiers central pour augmenter votre taux de cache-hit et de réduire la quantité d'espace dont vous aurez besoin.
pour mettre en cache correctement, vous devez utiliser une convention de nommage prévisible qui tient compte de toutes les différentes façons dont vous voulez que votre image s'affiche, c'est-à-dire utiliser quelque chose comme myimage_blurred_320x200.jpg pour enregistrer un jpeg qui a été flou et redimensionné à 300 largeur et 200 hauteur, etc.
une autre approche consiste à placer votre serveur d'image derrière un serveur proxy de telle sorte que toute la logique de mise en cache soit faite automatiquement pour vous et vos images sont servi par un serveur Web natif rapide.
Votre ne va pas être en mesure de servir des millions d'images redimensionnées toute autre manière. C'est ainsi que Google et Bing maps le font, ils prégénèrent toutes les images dont ils ont besoin pour le monde à des degrés différents prédéfinis afin qu'ils puissent fournir des performances adéquates et être en mesure de retourner des images statiques prégénées.
si php est trop lent, vous devriez envisager d'utiliser les bibliothèques graphiques 2D de Java ou .NET car elles sont très riches et peut prendre en charge tous vos besoins. Pour obtenir un aperçu de L'API graphiques, voici une méthode dans .NET qui redimensionnera n'importe quelle image à la nouvelle largeur ou hauteur spécifiée. Si vous omettez une hauteur ou une largeur, il redimensionne en maintenant le bon rapport d'aspect. Note de l'Image peut être créé à partir d'un JPG, GIF, PNG ou BMP:
// Creates a re-sized image from the SourceFile provided that retails the same aspect ratio of the SourceImage.
// - If either the width or height dimensions is not provided then the resized image will use the
// proportion of the provided dimension to calculate the missing one.
// - If both the width and height are provided then the resized image will have the dimensions provided
// with the sides of the excess portions clipped from the center of the image.
public static Image ResizeImage(Image sourceImage, int? newWidth, int? newHeight)
{
bool doNotScale = newWidth == null || newHeight == null; ;
if (newWidth == null)
{
newWidth = (int)(sourceImage.Width * ((float)newHeight / sourceImage.Height));
}
else if (newHeight == null)
{
newHeight = (int)(sourceImage.Height * ((float)newWidth) / sourceImage.Width);
}
var targetImage = new Bitmap(newWidth.Value, newHeight.Value);
Rectangle srcRect;
var desRect = new Rectangle(0, 0, newWidth.Value, newHeight.Value);
if (doNotScale)
{
srcRect = new Rectangle(0, 0, sourceImage.Width, sourceImage.Height);
}
else
{
if (sourceImage.Height > sourceImage.Width)
{
// clip the height
int delta = sourceImage.Height - sourceImage.Width;
srcRect = new Rectangle(0, delta / 2, sourceImage.Width, sourceImage.Width);
}
else
{
// clip the width
int delta = sourceImage.Width - sourceImage.Height;
srcRect = new Rectangle(delta / 2, 0, sourceImage.Height, sourceImage.Height);
}
}
using (var g = Graphics.FromImage(targetImage))
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(sourceImage, desRect, srcRect, GraphicsUnit.Pixel);
}
return targetImage;
}
dans le temps que cette question a été posée, quelques entreprises ont surgi pour traiter cette question exacte. Ce n'est pas une question qui est isolée pour vous ou votre entreprise. De nombreuses entreprises en arrivent au point où elles doivent chercher une solution plus permanente à leurs besoins de traitement d'image.
les Services comme imgix servent de proxy et de CDN pour les opérations d'image comme le redimensionnement et l'application de superpositions. En manipulant L'URL, vous pouvez appliquer différentes transformations à chaque image. imgix répond à des milliards de demandes par jour.
vous pouvez également lancer des services sur votre propre et les mettre derrière un CDN. Les projets Open source comme imageproxy sont bons pour cela. Cela impose le fardeau de la maintenance à votre équipe des opérations.
(clause de non-responsabilité: je travaille pour imgix.)
ce que vous recherchez est le mieux assorti à Thumbor http://thumbor.readthedocs.org/en/latest/index.html , qui est open source, soutenu par une énorme compagnie (signifie qu'il ne disparaîtra pas demain), et les navires avec beaucoup de belles fonctionnalités comme la détection de ce qui est important sur une image lors de la Coupe.
pour le bas-coût plus CDN je suggère de le combiner avec Cloudfront et stockage AWS, ou une solution comparable avec un CDN libre comme Cloudflare. Ceux-ci ne sont peut-être pas les fournisseurs CDN les plus performants, mais au moins encore performent mieux qu'un serveur et déchargent également votre serveur d'image sur le pas cher. De plus, vous économiserez une tonne de bande passante.
si chaque image différente est identifiable de façon unique par une URL unique, alors J'utiliserais simplement un CDN comme AKAMAI. Laissez votre script PHP faire le travail et laissez AKAMAI gérer le chargement.
comme ce genre d'entreprise n'a généralement pas de problèmes de budget, ce serait le seul endroit que je regarderais.
Edit : cela ne fonctionne que si vous trouvez un CDN qui vous servira ce type de contenu.
ce même problème est maintenant résolu par image redimensionner les services dédiés à cette tâche. Ils présentent les caractéristiques suivantes:
- en CDN construit-vous n'avez pas à vous soucier de la distribution d'image
- image redimensionner à la volée - n'importe quelle taille requise est disponible
- pas de stockage nécessaire - il suffit de stocker l'image de base et toutes les variantes sont gérées par le service
- bibliothèques de L'écosystème - vous pouvez juste inclure le javascript et votre travail est fait pour tous les appareils et tous les navigateurs.
L'un de ces services est Gumlet . Vous pouvez également essayer une alternative open source comme NGINX plugin qui peut également redimensionner l'image à la volée.
(je travaille pour Gumlet.)