Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果在发送带有“的文件时”;readfile";我修改了文件,下载会失败吗?_Php_Apache_Http_Memory_File Io - Fatal编程技术网

Php 如果在发送带有“的文件时”;readfile";我修改了文件,下载会失败吗?

Php 如果在发送带有“的文件时”;readfile";我修改了文件,下载会失败吗?,php,apache,http,memory,file-io,Php,Apache,Http,Memory,File Io,如果我使用readfile()将一个大文件(200mb)发送到浏览器,并且在用户下载时我修改了该文件,下载会成功完成吗?如果没有-如何修改不断下载的大型文件?我认为这取决于如何处理下载 如果文件保存到服务器上的单独内存位置,并且您修改了实际文件。由于用户正试图在备用内存位置下载文件,因此不应影响该文件。我无法测试此问题,但下载很可能会损坏,并且readfile()将返回false并抛出错误。另一个选项,iffreadfile()锁定文件是,在文件完成读取之前,您将无法写入该文件-但我认为情况并非

如果我使用
readfile()
将一个大文件(200mb)发送到浏览器,并且在用户下载时我修改了该文件,下载会成功完成吗?如果没有-如何修改不断下载的大型文件?

我认为这取决于如何处理下载


如果文件保存到服务器上的单独内存位置,并且您修改了实际文件。由于用户正试图在备用内存位置下载文件,因此不应影响该文件。

我无法测试此问题,但下载很可能会损坏,并且
readfile()
将返回false并抛出错误。另一个选项,iff
readfile()
锁定文件是,在文件完成读取之前,您将无法写入该文件-但我认为情况并非如此

如果我是你,我会复制文件,提供它,然后删除它。您可能还希望将文件内容加载到内存中并提供服务,但对于200MB的文件来说,这是不现实的

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

copy($file, $temp);    
readfile($temp);    
unlink($temp);

您最好的选择是放置一个新文件,然后更新代码以加载新文件。这样,下载旧文件的用户将继续这样做,但您将能够转换到新文件。

否,如果您直接编辑文件数据,将无法成功完成。将收到损坏的文件

然而

在Linux中,如果您
rm
mv
一个文件,任何已经打开该文件的程序都将继续访问它。只有关闭文件后,文件才会完全释放。因此,您可以通过以下步骤安全地编辑大文件:

  • 将文件复制到临时名称
  • 编辑文件
  • 正在下载的rm文件;正在下载的mv新文件

  • 我还没有对此进行测试,但这应该允许所有下载200mb文件的人都能完整地接收他们的副本,新的下载者将获得您的更新版本。

    readfile()
    直接刷新输出,它不会将整个文件加载到内存中。这取决于您在何处/何时进行修改-在用户已经获得字节后覆盖文件开头附近的一些字节不会影响下载。在当前下载点之前+之后更改字节将导致文件损坏。如果浏览器严格遵守其收到的原始内容长度标题,在结尾添加一些字节可能不会显示。@barin:用两种可能的解决方案更新了我的答案。我不太明白你所说的“复制文件,提供文件,然后删除”是什么意思-你能详细说明一下吗?@barin:我是说复制文件,查看我的更新以获取一些示例代码。这是一个不错的解决方案。但每次下载都复制一个文件真的实用吗?@barin:这取决于你的具体用途,但我认为是这样。最后,您必须始终将文件复制到磁盘或内存中@jimp解决方案似乎更好一些,但我怀疑它是否能按预期工作。php的“unlink()”是否在内部使用“rm”?Linux文件系统实际上是“unlink”一个文件。准确地说,PHP的
    unlink()
    实际上在调用
    unlink()
    系统调用,就像
    rm
    一样。我很好奇PHP的
    readfile()
    是否在整个读取过程中都保持文件打开,所以我查看了PHP源代码。是的。C代码实际上类似于PHP等价物:
    $fp=fopen();if($fp){fpassthru($fp);fclose($fp);}
    (PHPV5.3.6,源ext/standard/file.c,第1484-1489行)。我仍然很感兴趣,如果这是你打算的工作。如果你测试它,请报告。我现在无法测试,但我会在几天内尝试测试。必须跟进,这有效吗?我也从未测试过它,但我很想知道下一个文件管理器项目。