Pergunta

Existem algumas perguntas muito boas aqui no SO sobre o gerenciamento de arquivos e armazenamento dentro de um grande projeto.

armazenar imagens em DB - sim ou não que você armazenar dados binários no banco de dados ou no arquivo sistema?

O primeiro deles tendo alguns grandes insights e no meu projeto eu decidi ir a rota de arquivo e não a rota DB.

Um grande ponto de encontro a usar o sistema de arquivos é backup. Mas, em nosso sistema, temos um grande esquema de backup por isso não estou preocupado com isso.

O próximo caminho é como armazenar os arquivos reais. E eu pensei em ter os arquivos estática local em todos os momentos e criar um sistema de diretório virtual no lado do banco de dados de coisas. Então links para o arquivo não mudam.

O sistema i estou construindo terá um gerenciamento de arquivos global para todos os arquivos são acessíveis a todos os utilizadores. Mas muitos que passaram a conversa rota de arquivo sobre o tamanho do diretório físico (se todos os arquivos estão dentro de um diretório por exemplo)

Então, minha pergunta é, quais são algumas dicas ou melhores métodos de prática na criação de pastas para estes arquivos estáticos, ou se eu não deveria ir a rota diretório virtual em tudo.

(o projeto está na pilha LAMP (PHP) se isso ajuda em tudo)

Foi útil?

Solução

Uma maneira é atribuir um número único para cada arquivo e usá-lo para procurar a localização real do ficheiro. Então você um uso esse número para distribuir arquivos em diferentes diretórios no sistema de arquivos. Por exemplo, você poderia usar algo como este esquema:

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

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

Outras dicas

Eu corri para este problema há algum tempo para um site que estava hospedando um monte de arquivos. O que fizemos foi tomar um GUID (que é também o campo de chave primária de um arquivo) (por exemplo BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) e armazenar um arquivo como este: / B / C / C / BCC46E3F-2F7A-42b1 -92CE-DBD6EC6D6301 / filename.ext

Isto tem algumas vantagens:

  • Você pode dimensionar os servidores de arquivos em vários servidores (e diretórios específicos atribuir a cada um)
  • Você não tem que mudar o nome do arquivo
  • Seus diretórios são garantidos para ser único

Espero que isso ajude!

A fim de evitar a criação de um número excessivo de entradas em um único diretório, você pode querer base de criação de diretórios em pedaços de nome do arquivo. Assim, por exemplo, se você tem um arquivo chamado d7f5ae9b7c5a.png, você pode querer armazená-lo em media / d7 / F5 / d7f5ae9b7c5a.png. Se os seus nomes estão todos hexadecimal, então isso vai restringir o número de entradas em um único diretório para 256 até o nível final.

  1. uma imagem do usuário ~ 100kb, então vamos ter 10 000 utilizadores em banco de dados, cada usuário terá, em média, 5 imagens, por isso vamos ter 5 terabytes DB, e cada saída de imagem será executado através de um DB e este tráfego DB extra vai reduzir a perfomance geral do servidor DB. ... você pode usar o cluster DB para evitar isso, mas suponho que é caro

  2. relatório do usuário sobre o erro na base de dados ao vivo, (em teste - todos os trabalhos corretamente), como você criar despejar um descompactá-lo na máquina de desenvolvedores? Quanto tempo vai demorar?

  3. Em um momento você pode decidir colocar imagens em algum CDN, quais serão as mudanças em seu código-fonte?

Eu costumo tomar essa atitude:

Tenha uma variável de configurações globais para o seu aplicativo que aponta para a pasta onde você armazena arquivos enviados. Em sua loja de banco de dados os caminhos relativos para os arquivos (em relação ao que as definições de pontos variável até).

Então, se um arquivo está localizado na /www/uploads/image.jpg, suas configurações de pontos varible para / www / uploads de sua linha de banco de dados tem image.jpg. Esta é uma maneira flexível que separa a sua estrutura de diretórios de sistemas a partir da aplicação.

Além disso, você pode fragmentar o armazenamento de arquivos em diretórios com base no que as tabelas de banco de dados estes relacionar. Digamos que você tenha um user_reports mesa e uma user_photos tabela. Você armazenar os arquivos que se relacionam com user_reports em / www / uploads / user_reports. Se você tem grande número de uploads de usuário que você pode implementar fragmentaion ainda mais. Digamos que um usuário envia um arquivo em 20.03.2009, o arquivo é chamado report.pdf, para que armazená-lo em /www/uploads/user_reports/2009/03/20/report.pdf.

Eu não posso dizer muito sobre como o Apache eo PHP gerenciar arquivos, mas eu posso dizer algo sobre o sistema de arquivos ext3. O ext3 não parecem ter problemas com um grande número de arquivos no mesmo diretório. Eu testei com até um milhão de arquivos. Verifique se a opção dir_index está habilitado no sistema de arquivos antes de criar os diretórios. Você pode verificar por dump2fs em execução e mudar esta opção, executando tune2fs. Hash os arquivos em uma árvore de subdiretórios ainda pode ser útil porque as ferramentas de linha de comando ainda pode ter problemas ao listar o conteúdo do diretório.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top