Если при отправке файла с «readfile» я изменю файл, произойдет ли загрузка? - PullRequest
1 голос
/ 16 июня 2011

Если я отправлю большой (200 МБ) файл в браузер с readfile(), и пока пользователь загружает, я изменю файл, завершится ли загрузка успешно? Если нет - как изменить большие файлы, которые постоянно загружаются?

Ответы [ 4 ]

2 голосов
/ 16 июня 2011

Нет, он не завершится успешно, если вы отредактируете данные файла напрямую. Поврежденный файл будет получен.

Однако ...

В Linux, если вы rm или mv файл, любая программа, у которой уже открыт этот файл, продолжит доступ к нему. Только когда файл закрыт, файл полностью освобождается. Поэтому вы можете безопасно редактировать большой файл, выполнив следующие действия:

  1. Скопируйте файл во временное имя.
  2. Редактировать файл.
  3. rm file_being_downloaded; mv new_file file_being_downloaded;

Я не проверял это, но это должно позволить всем людям, загружающим файл 200 МБ, получать свою копию полностью в такте, а новые загрузчики получат вашу обновленную версию.

1 голос
/ 16 июня 2011

Я не могу проверить это, но, скорее всего, загрузка будет повреждена, а readfile() вернет false и выдаст ошибку. Другой вариант, если readfile() блокирует файл, это то, что вы не сможете записать файл, пока он не закончит его читать - я не думаю, что это хотя дело.

На вашем месте я бы продублировал файл, подал его, а затем удалил. Возможно, вы также захотите загрузить содержимое файла в память и обработать его, но для файла размером 200 МБ это будет непрактично ...

$file = '/path/to/file.200mb';
$temp = tempnam(sys_get_temp_dir(), time() . '_');

copy($file, $temp);    
readfile($temp);    
unlink($temp);
0 голосов
/ 16 июня 2011

Лучше всего создать новый файл, а затем обновить код для загрузки нового файла.Таким образом, пользователи, которые скачивают старый файл, будут продолжать это делать, но вы сможете перейти к новому файлу.

0 голосов
/ 16 июня 2011

Я бы сказал, что это зависит от того, как выполняется загрузка.

Если файл сохранен в отдельной ячейке памяти на сервере, и вы изменяете фактический файл.Поскольку пользователь пытается загрузить файл в альтернативной позиции памяти, это не должно повлиять на него.

...