Ao colar um arquivo “sobre” outro arquivo com o mesmo nome, há um breve momento durante o qual nenhum arquivo existe?

5

Isso costumava me preocupar sempre que eu estava substituindo arquivos HTML estáticos em um ambiente de hospedagem compartilhada.

Ao colar (ou FTP) um arquivo "sobre" outro arquivo com o mesmo nome, há um breve momento durante o qual nenhum arquivo existe?

Se eu tiver index.html em um servidor da web e eu colar um novo index.html sobre ele, há uma chance de que os usuários que solicitam esse arquivo recebam um erro 404 ?

    
por Closure Cowboy 16.03.2011 / 06:01

2 respostas

3

Isso realmente depende de duas coisas: como o arquivo está sendo substituído e qual é o sistema operacional subjacente ao servidor WWW. Aqui estão três exemplos para mostrar como isso faz a diferença:

  • Um sistema operacional compatível com POSIX usando mv para atualizar o arquivo de um arquivo temporário pré-preparado: mv tem garantia de chamar (ou se comportar como) rename() , que por sua vez, de acordo com a especificação POSIX, garante que em todos os momentos o nome do arquivo alvo, neste caso index.html , sempre referencie alguns arquivo, seja ele original ou novo. E o conteúdo do arquivo nunca estará em um estado parcialmente escrito.

    O mesmo vale para um servidor FTP / HTTP que faz upload para um arquivo temporário e chama rename() , quando o arquivo temporário é completamente carregado, para mover o arquivo temporário para o destino especificado.

  • Microsoft Windows usando o um comando MOVE de algum tipo para atualizar o arquivo um arquivo temporário pré-preparado: A implementação usual de um comando MOVE (como pode ser visto aqui em a origem do comando ReactOS MOVE ) é chamar MoveFileEx() com o sinalizador MOVEFILE_REPLACE_EXISTING definido. Isso, pelo menos no Windows NT (porque o sinalizador é passado para os drivers do sistema de arquivos que são necessários para suportar renomeações atômicas), garante que um arquivo chamado index.html sempre existirá, como com POSIX e rename() .

    O mesmo vale para um servidor FTP / HTTP que faz o upload para um arquivo temporário e que chama MoveFileEx() , quando o arquivo temporário é completamente carregado, para mover o arquivo temporário para o destino especificado.

  • Microsoft Windows usando o um comando COPY de algum tipo para atualizar o arquivo de um arquivo temporário pré-preparado: O comando COPY não usa MoveFileEx() . Em vez disso, ele abre o arquivo existente, truncando-o para comprimento zero e o reescreve no lugar (novamente, cf CopyFileEx() no ReactOS . Embora nunca haja um ponto em que o nome index.html não aponte para um arquivo, o arquivo para o qual ele aponta estará em um estado parcialmente escrito durante o processo de cópia, e é possível que o servidor WWW sirva.

    O mesmo vale para um servidor FTP / HTTP que (a) apenas carrega arquivos no lugar, truncando e substituindo os originais, ou (b) enviando para um arquivo temporário, mas depois copia o arquivo temporário para o destino especificado.

Resumindo: Se você estiver enviando por meio de um servidor FTP / HTTP, isso depende de como o servidor FTP / HTTP funciona internamente. Se você estiver modificando diretamente a área de armazenamento de arquivos do servidor WWW, isso dependerá de quais ferramentas você usa para fazer isso.

    
por 18.03.2011 / 14:36
1

O arquivo ainda estará lá, mas se ele solicitar na hora errada, poderá estar em um estado intermediário (vazio ou truncado).

Se o programa que manuseia o upload do arquivo for inteligente o suficiente, ele poderá fazer o upload para um novo nome e, em seguida, substituir o arquivo antigo. Em caso afirmativo, haverá de fato um intervalo breve muito em que o nome index.html não existe, mas existe o nome do arquivo temporário ou um backup da versão anterior do arquivo. (O primeiro pode estar em um diretório temporário e, portanto, não é visível do lado de fora).

    
por 16.03.2011 / 06:02