Le stockage d'un grand nombre d'images
Je suis en train de réfléchir à développer mon propre PHP galerie pour stocker beaucoup de photos, peut-être dans les dizaines de milliers de personnes.
À la base de données je vais pointer vers l'url de l'image, mais voici le problème: je sais, c'est pas pratique d'avoir tous assis dans le même répertoire sur le serveur car il permettrait de ralentir l'accès à une analyse, alors, comment voulez-vous stocker tous? Une sorte d'arbre basé sur le nom de l'jpeg/png?
Quelles sont les règles de partition, les images vous me recommander?
(Il sera porté pour l'utilisation dans cheapo dot coms, donc pas de déformation avec le serveur est possible)
Vous devez vous connecter pour publier un commentaire.
Nous avons eu un problème similaire dans le passé. Et trouvé une solution sympa:
Nous avons connu ce en utilisant le guid, vous obtenez une plus ou moins uniforme de la division. Et cela a fonctionné comme un charme.
Liens qui pourraient aider à générer un numéro d'identification unique:
J'ai travaillé sur un système Électronique de Gestion documentaire il y a quelques années, et nous l'avons fait à peu près ce que Gamecat et wic suggéré.
Qui est, d'attribuer à chaque image un ID unique, et l'utiliser pour tirer un chemin relatif vers le fichier image. Nous avons utilisé le MOD similaire à ce que wic suggéré, mais nous a permis de 1024 dossiers/fichiers à chaque niveau, avec 3 niveaux, de sorte que nous pourrions soutenir 1G fichiers.
Nous avons dépouillé de l'extension de la fichiers. La DB enregistrements contenus le Type MIME, de sorte que l'extension n'était pas nécessaire.
Je ne voudrais pas vous recommandons de conserver l'URL complète dans la base de données d'enregistrement, seul l'ID de l'Image. Si vous stockez l'URL que vous ne pouvez pas déplacer ou réorganiser votre espace de stockage sans avoir à les convertir votre base de données. Une URL relative serait ok, puisque de cette façon, vous pouvez au moins déplacer l'image référentiel autour, mais vous aurez plus de flexibilité si vous venez de stocker le code et d'en tirer le URL.
Aussi, je recommande de ne pas permettre des références directes à vos fichiers image à partir du web. Au lieu de cela, fournir une URL à un programme côté serveur (par exemple, Java Servlet), avec l'ID de l'Image fourni dans l'URL de la Requête (
http://url.com/GetImage?imageID=1234
).La servlet pouvez utiliser cet IDENTIFIANT pour rechercher la base de données d'enregistrement, de déterminer le Type MIME, et d'en tirer l'emplacement réel, vérifier les restrictions de sécurité, l'exploitation forestière, etc.
J'ai l'habitude de simplement utiliser la base de données numériques id (auto_increment), puis utilisez la modulu (%) de l'opérateur de déterminer où placer le fichier. Simple et évolutive. Par exemple, le chemin vers l'image avec l'id 12345 pourrait être créé comme ceci:
Se termine dans:
Ou quelque chose comme ça.
Si vous utilisez Linux ext3 et le système de fichiers, vous devez être conscient qu'il ya des limites sur le nombre de répertoires et de fichiers que vous pouvez avoir dans un répertoire. La limite est de 32000 pour dirs, de sorte que vous devrait toujours s'efforcer de maintenir le nombre de dirs faible.
C'est une hypothèse.
J'ai conçu des systèmes où nous avons eu des millions de fichiers stockés à plat dans un répertoire, et il a très bien fonctionné. C'est aussi le système le plus facile à programmer. La plupart des systèmes de fichiers du serveur en charge cette sans problème (bien que vous auriez à voir laquelle vous utilisez).
http://www.databasesandlife.com/flat-directories/
Lors de l'enregistrement des fichiers associés à un id auto_increment, j'utilise quelque chose comme la suivante, ce qui crée trois niveaux de répertoire, chacun composé de 1000 dirs, et 100 fichiers dans chaque tiers-répertoire de niveau. Ce soutient ~ 100 milliards de fichiers.
si $id = 99532455444 alors la suivante retourne /995/324/554/44
Regarder système de fichiers XFS. Il prend en charge un nombre illimité de fichiers, et Linux prend en charge.
http://oss.sgi.com/projects/xfs/papers/xfs_usenix/index.html
Vous pourriez alawys ont une colonne DateTime dans la table, puis de les stocker dans des dossiers nommés après le mois,l'année ou le mois,le jour,l'année, les images ajoutées à la table.
Exemple
de cette façon, vous vous retrouvez avec pas plus de 3 dossiers de profondeur.
Je suis actuellement confronté à ce problème, et ce qu'Isaac a écrit m'a intéressé dans l'idée. Tho ma fonction diffère un peu.
Mes images ne sont en milliers donc je n'ai que cela à 999999 limite et donc, il serait divisé en 99/99/99.jpg ou 43524 en 04/35/24.jpg
Utiliser la hiérarchie du système de fichiers. ID de vos images à l'aide de quelque chose comme 001/002/003/004.jpg serait très utile. Le partitionnement est une autre histoire, cependant. Peut être aléatoire, basée sur le contenu, la date de création, etc. Dépend vraiment de ce que votre demande est.
Vous pouvez consulter le aux utilisé par Apple iPod pour stocker du contenu multimédia. Il y a des dossiers dans un niveau de profondeur et de fichiers avec des titres de même largeur. Je crois que Apple gars a investi beaucoup de temps dans les tests de leur solution de sorte qu'il peut apporter certains avantages instantanés pour vous.
Si les photos vous êtes la manipulation sont des photos numériques, vous pouvez utiliser les données EXIF de les trier, par exemple par date de capture.
Vous pouvez stocker les images dans la base de données d'objets blob (varbinary pour mssql). De cette façon, vous n'avez pas à vous soucier du stockage ou de la structure de répertoire. Le seul inconvénient est que vous ne pouvez pas facilement parcourir les fichiers, mais cela serait difficile à l'équilibre de l'arbre de répertoire, de toute façon.