31 votes

PHP pour stocker des images dans MySQL ou pas?

J'ai construit une petite application web en PHP où les utilisateurs doivent d'abord ouvrir une session. Une fois connecté, j'ai l'intention de montrer un petit aperçu en tant que partie de leur "profil".

Je vais avoir à s'assurer que l'image est en dessous d'une taille particulière pour économiser de l'espace, ou de s'assurer qu'il est une résolution particulière, ou les deux, ou peut-être même utiliser quelque chose comme feut à l'échelle vers le bas.
Pas sûr de ce que la meilleure approche pour que est pourtant, toutes les idées bienvenues.

Aussi, j'ai été d'essayer de déterminer s'il est préférable de stocker l'image dans l' users table de MySQL comme un blob, ou peut-être un distinct images table avec un id unique, et qu'à stocker l'image appropriée id dans l' users tableau, ou tout simplement enregistrer le fichier téléchargé sur le serveur (via une page de téléchargement) et enregistrez le fichier en tant que theUsersUniqueUsername.jpg. La meilleure option?

J'ai trouvé un tutoriel sur la sauvegarde des images dans mysql ici: http://www.phpriot.com/articles/images-in-mysql

Je suis seulement un passe-temps programmeur, et que vous n'avez jamais rien fait de tel avant, de sorte que des exemples, et/ou beaucoup de détails, c'est grandement apprécié.

40voto

Mario Points 1372

Toujours en fonction du contexte, mais généralement, je stocke une image utilisateur sur le système de fichiers dans un dossier appelé /content/user/{user_id}.jpg et essayez à la peine de la base de données aussi peu que possible.

23voto

Philip Morton Points 24913

Je voudrais vous recommandons de conserver l'image dans un fichier et ensuite l'URI du fichier dans la base de données. Si vous stocker toutes les images dans la base de données, vous pourriez avoir quelques problèmes avec la mise à l'échelle à une date ultérieure.

Découvrez cette réponse trop:

Microsoft conseils pour SQL Server utilisé pour être, pour la vitesse et de la taille, de stocker des images dans le système de fichiers, avec des liens dans la base de données. Je pense qu'ils ont adouci leur préférence un peu, mais j'ai encore une meilleure idée certainement pour la taille, car il ne prend pas de place dans la base de données.

17voto

Joseph Earl Points 199

Les généraux de l'aide BLOB est beaucoup moins que la plupart des gens voudraient vous faire croire, surtout si vous le mettez en place droite. Si vous utilisez un serveur distinct seulement l'exécution de la DB pour stocker des fichiers binaires, alors vous pouvez en fait utiliser aucun système de fichiers à tous et d'éviter toute surcharge du système de fichiers

Cela dit, le plus simple/la meilleure façon, sauf si vous avez un couple de serveurs pour vous est de les stocker dans le système de fichiers

  • Ne pas stocker l'URL absolue du fichier dans votre base de données, juste la partie unique (et, éventuellement, d'un dossier ou les deux), par exemple, 2009/uniqueImageName.jpg ou juste uniqueImageName.jpg. Alors dans vos pages ajoutez simplement de l'hôte et d'autres dossiers sur le devant, de cette façon, vous avez une certaine souplesse dans le déplacement de vos images, vous aurez besoin de changer une ligne ou deux dans votre PHP/ASP.NET page.

  • Il n'est pas nécessaire de stocker en dehors de la racine du document de sécurité - .htaccess le fichier avec DENY from ALL fonctionnera de la même et de donner plus de souplesse

  • Pas besoin de "shunt" images tant pour la sécurité, il suffit d'avoir un getImage.php page ou quelque chose, et puis au lieu d'insérer l'URL de l' src de la image, utilisez quelque chose comme getImage.php?file=uniqueImageName.jpg. Puis l' getImage.php le fichier peut vérifier si l'utilisateur est autorisé et s'emparer de l'image (ou pas).

  • Utiliser un nom qui est unique (de préférence un entier c'est à dire de la clé primaire) lors du stockage, de certains fichiers système (Windows) sont insensibles à la casse, donc, JoeBloggs.jpg et joebloggs.jpg sont uniques pour la base de données, mais pas pour le système de fichiers, donc on va écraser l'autre.

  • Utiliser un tableau distinct pour les images, et de stocker la clé primaire de l'image dans la table des utilisateurs. Si jamais vous voulez ajouter plus de champs ou d'apporter des modifications à l'avenir, il sera plus facile - c'est aussi une bonne pratique.

Si vous êtes inquiet à propos de SEO et des choses comme ça, stocker l'image du nom de fichier d'origine dans un autre domaine lorsque vous téléchargez, vous pouvez ensuite l'utiliser dans votre sortie (comme dans l' alt tag).

16voto

Ben D Points 7458

Contester la Sagesse Conventionnelle!

Bien sûr, il dépend du contexte, mais j'ai une très grande application avec des milliers d'images et de documents stockés comme des objets BLOB dans une base de données MySQL (taille moyenne=2 MO) et l'application fonctionne très bien sur un serveur avec une mémoire de 256 mo. Le secret est de corriger la structure de base de données. Toujours garder les deux tableaux distincts, l'un des qui stocke les informations de base sur le fichier, et de l'autre de la table doit juste contenir le blob en plus d'une clé primaire pour y accéder. Toutes les requêtes de base sera exécuté sur la table détails, et de l'autre table est seulement l'accès lorsque le fichier est réellement nécessaire, et il est accessible à l'aide d'une clé indexées afin que les performances sont très bonnes.

Les avantages de stocker des fichiers dans la base de données sont multiples:

  1. Beaucoup plus facile systèmes de secours sont nécessaires, que vous n'avez pas besoin de sauvegarder le système de fichiers
  2. Contrôle de sécurité des fichiers est beaucoup plus facile comme vous pouvez le valider avant de relâcher le binaire (oui, vous pouvez enregistrer le fichier dans un répertoire et un script de lire et de régurgiter le fichier, mais les performances ne seront pas sensiblement plus rapide.
  3. (Similaire à #1), Il sépare le "contenu utilisateur" et "système de contenu", faisant les migrations et le clonage plus facile.
  4. Plus facile de gérer des fichiers, de la piste/store des changements de version, etc, que vous avez besoin de moins de modification du script pour ajouter des contrôles de version dans.

Si la performance est un gros problème et de sécurité et les sauvegardes ne sont pas (ou si vous avez une bonne fs système de sauvegarde), alors vous pouvez le stocker la la FS, mais même alors, j'ai souvent de stocker des fichiers (dans le cas des images) dans la base de données et la construction d'une mise en cache script qui écrit l'image dans un dossier de cache après la première fois qu'il l'utilise (oui, ce n'utilise plus d'espace disque, mais qui n'est presque jamais un facteur limitant).

De toute façon, évidemment FS fonctionne bien dans de nombreux cas, mais je trouve personnellement gestion de base de données beaucoup plus facile et plus flexible, et si bien écrit l'exécution des sanctions sont extrêmement petites.

10voto

Neil Aitken Points 5023

Nous avons créé une boutique d'images stockées dans la base de données. Il a très bien fonctionné pendant le développement, mais une fois que nous l'avons testé sur les serveurs de production le temps de chargement de page est beaucoup trop élevé, et il a ajouté inutile de charge pour les serveurs de DB.

Alors qu'il semble attrayant pour stocker des fichiers binaires dans la DB, l'extraction et la manipulation d'entre eux ajoute de la complexité qui peut être évité en gardant juste les fichiers sur le système de fichiers et le stockage des chemins / métadonnées dans la base de données.

C'est l'un de ces éternels débats, avec d'excellents arguments des deux côtés, mais pour mon argent, je voudrais garder des images à l'écart de la DB.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X