5

Это беспокоило меня всякий раз, когда я заменял статические HTML-файлы в общедоступной среде веб-хостинга.

При вставке (или FTP) файла "поверх" другого файла с тем же именем, существует ли краткий момент, в течение которого ни один файл не существует?

Если у меня есть index.html на веб-сервере, и я вставляю поверх него новый index.html , есть ли вероятность, что пользователи, запрашивающие этот файл, получат ошибку 404 ?

2 ответа2

3

Это действительно зависит от двух вещей: как файл заменяется и какая операционная система лежит в основе WWW-сервера. Вот три примера, чтобы показать, как это имеет значение:

  • POSIX-совместимая операционная система, использующая mv для обновления файла из предварительно подготовленного временного файла: mv гарантированно вызывает (или ведет себя как) rename(), что, в свою очередь, согласно спецификации POSIX, гарантирует, что цель всегда имя файла, в этом случае index.html , всегда будет ссылаться на некоторый файл, будь то оригинальный или новый файл. И содержимое файла никогда не будет в частично написанном состоянии.

    То же самое относится к FTP/HTTP-серверу, который загружает во временный файл и затем вызывает rename() , когда временный файл полностью загружен, чтобы переместить временный файл в указанное место назначения.

  • Microsoft Windows использует какую-то команду MOVE для обновления файла предварительно подготовленного временного файла: Обычная реализация команды MOVE (как можно увидеть здесь, в источнике команды ReactOS MOVE) - это вызвать MoveFileEx() с Установлен флаг MOVEFILE_REPLACE_EXISTING . Это, по крайней мере, в Windows NT (поскольку флаг передается драйверам файловой системы, которые необходимы для поддержки атомарного переименования), гарантирует, что файл с именем index.html всегда будет существовать, как в случае POSIX и rename() .

    То же самое относится и к FTP/HTTP-серверу, который загружает во временный файл и затем вызывает MoveFileEx() , когда временный файл полностью загружен, чтобы переместить временный файл в указанное место назначения.

  • Microsoft Windows использует какую-либо команду COPY для обновления файла из предварительно подготовленного временного файла: команда COPY не использует MoveFileEx() . Скорее, он открывает существующий файл, обрезая его до нулевой длины, и перезаписывает его на место (опять же, cf CopyFileEx() в ReactOS). Хотя никогда не будет точки, в которой имя index.html не указывает на файл, файл, на который он указывает, будет частично записан в процессе копирования, и возможно, что WWW-сервер будет обслуживать до усеченных версий этого файла как следствие.

    То же самое относится и к серверу FTP/HTTP, который либо (а) просто загружает файлы на месте, обрезает и перезаписывает оригиналы, либо (б) загружает во временный файл, но затем копирует временный файл в указанное место назначения.

Короче говоря: если вы загружаете через FTP/HTTP-сервер, это зависит от того, как ваш FTP/HTTP-сервер работает внутри. Если вы непосредственно изменяете область хранения файлов WWW-сервера, то это зависит от того, какие инструменты вы используете для этого.

1

Файл все еще будет там, но если они запросят его в неправильное время, он может находиться в промежуточном состоянии (пустой или усеченный).

Если программа, которая обрабатывает загрузку файла, достаточно умна, она может загрузить новое имя и затем заменить старый файл. Если это так, действительно будет очень короткий интервал, когда имя index.html не существует, но существует временное имя файла или резервная копия предыдущей версии файла. (Первый может быть во временном каталоге и поэтому не виден снаружи.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .