Question

Il y a quelques très bonnes questions ici sur le SO de la gestion de fichiers et de stockage dans un grand projet.

  

Enregistrement d'images dans DB - Oui ou Non
   Souhaitez-vous stocker des données binaires dans la base de données ou dans le fichier système

Le premier ayant quelques grandes intuitions et mon projet, je l'ai décidé d'aller la route fichier et non la route DB.

Un point important contre l'utilisation du système de fichiers est sauvegarde. Mais dans notre système, nous avons un système de sauvegarde grand donc je ne suis pas inquiet à ce sujet.

Le chemin suivant est comment stocker les fichiers réels. Et j'ai pensé à avoir l'emplacement de fichiers statiques à tout moment et créer un système de répertoire virtuel du côté de la base de données des choses. Ainsi, des liens vers le fichier ne changent pas.

Le système je suis bâtiment aura une gestion de fichier global pour tous les fichiers sont accessibles à tous les utilisateurs. Mais beaucoup qui sont allés le discours de route de fichier sur la taille du répertoire physique (si tous les fichiers sont dans un répertoire par exemple)

Alors, ma question est, quels sont quelques conseils ou méthodes de meilleures pratiques dans la création de dossiers pour ces fichiers statiques, ou si je ne devrais pas aller la route du répertoire virtuel du tout.

(le projet est sur la pile LAMP (PHP) si cela aide à tous)

Était-ce utile?

La solution

Une façon est d'attribuer un numéro unique à chaque fichier et l'utiliser pour rechercher l'emplacement du fichier réel. Ensuite, vous l'utiliser ce numéro pour distribuer des fichiers dans des répertoires différents dans le système de fichiers. Par exemple, vous pouvez utiliser quelque chose comme ce schéma:

/images/{0}/{1}/{2}

  

{0}: file_number % 100
  
{1}: (file_number / 100) % 100   {2}: file_number

Autres conseils

Je suis tombé sur ce problème il y a quelque temps pour un site Web qui a été l'hôte d'un grand nombre de fichiers. Ce que nous avons fait était de prendre un GUID (qui est aussi le champ de clé primaire d'un fichier) (par exemple BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) et stocker un fichier comme ceci: / B / C / C / BCC46E3F-2F7A-42B1 -92CE-DBD6EC6D6301 / filename.ext

a certains avantages:

  • Vous pouvez faire évoluer les serveurs de fichiers sur plusieurs serveurs (et attribuer des répertoires spécifiques à chacun)
  • Vous ne devez pas renommer le fichier
  • Vos répertoires sont garantis être unique

Hope this helps!

Afin d'éviter la création d'un nombre excessif d'entrées dans un seul répertoire, vous pouvez baser la création de répertoires sur des morceaux du nom de fichier. Ainsi, par exemple, si vous avez un fichier nommé d7f5ae9b7c5a.png, vous pouvez stocker dans les médias / D7 / f5 / d7f5ae9b7c5a.png. Si vos noms de fichiers sont tous hexadécimal alors cela limite le nombre d'entrées dans un répertoire unique à 256 jusqu'au dernier niveau.

  1. Une image utilisateur ~ 100kb, alors laissez avoir 10 000 utilisateurs dans la base de données, chaque utilisateur aura en moyenne 5 images, donc nous aurons 5 téraoctets DB, et chaque sortie d'image sera exécutée par un DB et ce DB trafic supplémentaire réduira le serveur général DB perfomance. ... vous pouvez utiliser le cluster DB pour éviter cela, mais supposons qu'il est cher

  2. Rapport utilisateur sur l'erreur sur la base de données en direct, (sur le test - tout fonctionne correctement), comment voulez-vous créer une décharge déballer sur la machine de développeurs? Combien de temps cela prendra?

  3. Dans un moment, vous pouvez décider de mettre des images sur certains CDN, quels seront les changements dans votre code source?

Je prends habituellement cette approche:

Avoir une variable de paramètres globaux pour votre application qui pointe vers le dossier où vous stockez les fichiers téléchargés. Dans la base de données stocker les chemins relatifs aux fichiers (par rapport à ce que les paramètres de points variables à).

Donc, si un fichier est situé à /www/uploads/image.jpg, vos paramètres de points à Varible / www / uploads votre ligne de base de données a image.jpg. Ceci est un moyen flexible qui découple depuis votre application structure de répertoires de votre système.

En outre, vous pouvez fragmenter le stockage de fichiers dans des répertoires sur la base de quelles tables base de données se rapportent à des. Disons que vous avez un user_reports de table et un user_photos de table. Vous stockez les fichiers qui se rapportent à user_reports dans / www / uploads / user_reports. Si vous avez un grand nombre de téléchargements d'utilisateurs que vous pouvez mettre en œuvre fragmentaion encore plus loin. Dire un utilisateur télécharge un fichier sur 20.03.2009, le fichier est appelé report.pdf, de sorte que vous stockez à /www/uploads/user_reports/2009/03/20/report.pdf.

Je ne peux pas dire grand-chose sur la façon dont apache et PHP gérer les fichiers, mais je peux dire quelque chose au sujet du système de fichiers ext3. ext3 ne semble pas avoir des problèmes avec un grand nombre de fichiers dans le même répertoire. Je l'ai testé avec jusqu'à un million de fichiers. Assurez-vous que l'option dir_index est activée sur le système de fichiers avant de créer les répertoires. Vous pouvez vérifier en exécutant dump2fs et changer cette option en exécutant tune2fs. Hachant les fichiers dans un arbre de sous-répertoires peut encore être utile parce que les outils de ligne de commande peuvent encore avoir des problèmes listant le contenu du répertoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top