如果我用readfile()
向浏览器发送一个大(200mb)文件,并且在用户下载时我修改了该文件,下载会成功吗?如果没有-我如何修改不断下载的大文件?
否,如果直接编辑文件数据,则不会成功完成。将收到损坏的文件。
然而。。。
在Linux中,如果rm
或mv
是一个文件,任何已经打开该文件的程序都会继续访问它。只有关闭该文件后,该文件才会完全释放。因此,您可以通过以下步骤安全地编辑您的大文件:
- 将文件复制到临时名称
- 编辑文件
rm file_being_downloaded; mv new_file file_being_downloaded;
我还没有测试过这一点,但这应该会让所有下载200 MB文件的人都能完整地收到他们的副本,新的下载者会得到你的更新版本。
我无法对此进行测试,但下载很可能会损坏,readfile()
将返回false并引发错误。另一个选项,iffreadfile()
锁定文件是,在文件完成读取之前,您将无法写入文件——不过我不认为是这样。
如果我是你,我会复制文件,提供它,然后删除它。你可能还想把文件内容加载到内存中并提供它,但对于200MB的文件来说,这是不切实际的。。。
$file = '/path/to/file.200mb';
$temp = tempnam(sys_get_temp_dir(), time() . '_');
copy($file, $temp);
readfile($temp);
unlink($temp);
我认为这取决于如何处理下载。
如果文件保存到服务器上的单独内存位置,并且您修改了实际文件。鉴于用户试图在备用内存位置下载文件,这不应该影响它。
最好的办法是建立一个新文件,然后更新代码以加载新文件。这样,下载旧文件的用户将继续这样做,但您可以转换到新文件。