architecture recommandée pour les téléchargements d'images des utilisateurs de manutention

StackOverflow https://stackoverflow.com/questions/1149364

Question

Dans le passé, j'ai manié le téléchargement de l'image utilisateur de deux façons différentes:

  • Enregistrer les données d'image dans une table de base de données, et le charger via un script PHP
  • Télécharger l'image, le convertir en jpeg, le mettre dans un répertoire et le charger via des balises HTML

La première option fonctionne assez bien, mais je devais garder des restrictions de taille assez contraignantes sur les images mises en ligne. La deuxième option de type travaillé, sauf pour la bibliothèque d'images de PHP serait souvent bâcler la conversion de fichiers (je pense que cela peut être résolu à l'aide ImageMagick, cependant).

Je suis maintenant confronté à le faire pour une troisième fois, sur une échelle potentiellement plus importante des utilisateurs. Je prévois déjà sur l'utilisation de ImageMagick pour faire un post-traitement à l'image après le téléchargement. J'aimerais garder les restrictions sur l'image télécharge plus faible possible et peut-être même de conserver toutes les photos que quelqu'un télécharge.

Il y aura des moments où des centaines des téléchargements de photos de l'utilisateur seront affichés sur l'écran comme une miniature à la fois. Le stockage de ces dans une base de données et en les tirant pour chacun d'eux et l'affichage via PHP ne semble pas être une bonne façon d'aller, mais jeter toutes les images dans un seul répertoire ne soit.

Quelle est votre recommandation dans cette situation? Avez-vous aller avec l'une des options ci-dessus ou avez-vous une autre solution?

Était-ce utile?

La solution

  

Le stockage de ces dans une base de données et en les tirant pour chacun d'eux et l'affichage via PHP ne semble pas être une bonne façon d'aller, mais jeter toutes les images dans un seul répertoire ne soit pas.

Vous pouvez adopter une approche hybride.

Stocke les images dans un heirarchy de dossiers (selon ce que vous décidez de système approprié pour votre application). Conservez le chemin complet à chaque image dans votre base de données.

Dans un travail de fond, ont des vignettes des images produites (dire avec ImageMagick) dont les noms diffèrent légèrement des images elles-mêmes (par exemple: ajouter « thumb- » à l'avant), mais qui sont stockés à côté des images réelles. Vous pouvez avoir un champ dans la base de données pour chaque image qui signifie « Ma miniature est prêt, alors s'il vous plaît me inclure dans des galeries ».

Lorsque vous obtenez une demande d'une galerie, tranche et dés le groupe d'images en utilisant des champs de base de données, puis produire un morceau de code HTML qui fait référence aux chemins miniatures appropriés et de l'image.


Edit: Ce que Aaron F dit est important lorsque vous devez gérer un très grand nombre de demandes. Partitionnement des données image / sql est une bonne route pour l'évolutivité. Vous aurez besoin de regarder les modèles d'accès dans votre application pour déterminer où se trouvent les points de séparation. Quelque chose que vous pouvez faire encore plus tôt est de mettre en cache le code HTML généré pour les galeries afin de réduire la charge SQL.

Autres conseils

Les deux exemples que vous citez ne clarifient pas la partie la plus importante: le partitionnement

.

par exemple. si elles sont stockées dans une base de données, faire les images se trouvent entièrement dans une table, sur un serveur de base de données? Ou est la table partitoned sur plusieurs serveurs / clusters?

par exemple. si elles sont stockées dans un répertoire, faire toutes les images se trouvent sur un disque dur? Ou faire des images carte pour séparer les lecteurs [RAID], en fonction de la première lettre du nom de connexion de l'utilisateur?

Un bon schéma de partitionnement est nécessaire pour l'évolutivité.

En ce qui concerne que l'affichage des vignettes en vrac, vous aurez probablement besoin d'un peu précalcul ici. à savoir créer les vignettes (peut-être par un travail ayschronous, a démarré juste après l'image est téléchargée) et les mettre en scène sur un serveur dédié. Voici comment Youtube fait des instantanés d'image de vidéos téléchargées.

Imho, la solution de David est le meilleur pour la plupart des cas, mais je modifierait deux détails:

  

Rangez le chemin complet à chaque image dans votre base de données.

Je ne pense pas que vous devez stocker les complet chemin, parce que si pour une raison quelconque le répertoire des images change, qui compliquerait votre vie un peu. Mémorisation le nom du fichier devrait être suffisant. Vous pouvez toujours inclure le chemin complet directement dans le code HTML.

  

ont vignettes des images produites (dire avec ImageMagick) dont les noms diffèrent légèrement des images elles-mêmes, mais qui sont stockés à côté des images réelles.

Je préfère mettre les vignettes dans un autre répertoire, un répertoire pour chaque pouce que vous créez, et avec exactement le même nom. J'ai déjà travaillé sur un site avec des milliers d'images de l'utilisateur et j'ai fait l'erreur de les mettre tous dans le même répertoire. Le répertoire a tellement augmenté qu'il est presque impossible d'ouvrir ce répertoire sans avoir à attendre plusieurs minutes.

  

bibliothèque d'images de PHP serait bâcler souvent la conversion de fichier

Je suggère d'augmenter la limite de mémoire dans le script où vous créez le pouce, spécialement si vous permettez le téléchargement des gros fichiers (2 Mo de +).

Vous pouvez le faire avec ini_set('memory_limit', '30M');. Bien sûr, le nombre réel est à vous. 30M a travaillé pour moi dans les sites de miniatures lourds.

Il y a quelques années, j'ai écrit une archive d'image intranet destiné à stocker en fin de compte quelque 340 000 scans en plus des vignettes relatives. Googler autour j'ai découvert qu'il n'y a aucune raison difficile de ne pas les jeter tous dans un seul répertoire aussi longtemps que vous ne demandez pas le système d'exploitation sous-jacente pour faire une liste de dossiers. Autrement dit, appelant à un ls / dir pendrait la machine mais juste récupérer des fichiers d'image uniques par leur nom de fichier (à partir de la base de données) impliquerait aucune pénalité de performance.

Cette archive est en cours depuis quelques années maintenant et je peux confirmer que cela fonctionne très bien avec quelque chose au-dessus de 60k images réellement stockées dans un dossier.

Je n'ai jamais eu aucun problème de conversion de choses à jpeg avec GD, mais pour ce travail particulier, je suis allé le chemin ImageMagick avec MagicWand comme une extension d'aide (principalement en raison de la documentation correcte).

Uhm pour créer des vignettes, utilisez phpThumb ... il est absolument parfait pour cette matière ... et a quelques extras, mais vous aurez probablement pas besoin de ces ... il crée automatiquement un cache local sur votre système de fichiers, il est donc économiser beaucoup de ressources ...

je pense, l'approche hybride est probablement la plus évolutive, à savoir stocker des fichiers sur le système de fichiers et les emplacements de fichiers dans une base de données ... De cette façon, vous pouvez stocker des métadonnées avec le fichier (comme créateur, le titre, les balises, etc. .), et garder votre base de données petite ... de plus, vous pouvez stocker vos images dans des endroits arbitraires (même sur d'autres machines, etc.), de sorte que vous pouvez facilement distribuer tout ce que la charge utile ...

greetz

back2dos

scroll top