Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.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 当用户下载一个大文件时,我更改它会发生什么?_Php_Download - Fatal编程技术网

Php 当用户下载一个大文件时,我更改它会发生什么?

Php 当用户下载一个大文件时,我更改它会发生什么?,php,download,Php,Download,在以下情况下会发生什么情况: 在后端,管理员上载了许多(大)文件,并对它们进行了压缩,从而生成example.zip 在某一点上,访问者来到站点并开始下载这个大文件。管理员添加了更多的文件并按下“转换为zip”。它开始压缩,结果写入相同的位置,相同的名称example.zip 用户下载了50%,新的zip是否会影响这一点?我知道PHP脚本会加载到内存中,但是如果您有大文件,这些文件就不适合 // OPENING THE FILE IN READ-ONLY $fp = fopen($filepa

在以下情况下会发生什么情况:

在后端,管理员上载了许多(大)文件,并对它们进行了压缩,从而生成
example.zip

在某一点上,访问者来到站点并开始下载这个大文件。管理员添加了更多的文件并按下“转换为zip”。它开始压缩,结果写入相同的位置,相同的名称
example.zip

用户下载了50%,新的zip是否会影响这一点?我知道PHP脚本会加载到内存中,但是如果您有大文件,这些文件就不适合

 // OPENING THE FILE IN READ-ONLY
$fp = fopen($filepath, "r");
$bufferlength = 1024;
while (!feof($fp) ){
    // READ A BUFFER SIZE OF THE FILE
    $buffer = fread($fp, $bufferlength);
    echo $buffer;
    $buffer = "";
    flush(); // THIS IS ESSENTIAL FOR LARGE DOWNLOADS
}
fclose($fp);

虽然我仍然不知道我的问题的答案,但我知道一个被删除的文件在使用时实际上不会被删除,直到它不再使用为止

这意味着,当用户下载一个大文件时,管理员会删除该文件,下载用户会继续下载该文件,但所有其他用户会显示为已删除

在本例中,我创建了一个
downloadZip.php
,单击它可以获得zip的最新版本。当管理员重新压缩所有内容时,将产生
name2.zip
,然后是
name3.zip


UserA单击下载,获取
name1.zip
。管理员删除,用户A不受影响,用户B现在在单击
downloadZip.php

时将获得
name2.zip
?也许我可以改进这个问题…你测试过这个吗?这种情况极不可能得到实施。Fopen会打开文件描述符,fread会一直读到最后,如果有人下载一个不断变化的文件,会简单地下载一个无法打开的zip文件,或者一个永不结束的请求,因为文件被一块一块地读,直到找到结尾。我将实现这一点,所以我想事先知道应该注意什么:)这将在资源有限的主机上进行,所以我不能简单地重命名它并生成另一个文件。同样的原则是,如果我在有人下载时删除它(并将另一个命名文件放在今天的日期作为回报),现在会发生什么?向用户提供一个500MB的zip,但它不会打开,这是一项糟糕的服务,我的目标不是:)这取决于文件系统及其配置。通常,写入打开读取的文件会损坏读取的数据,具体取决于已读取的内容和写入数据的位置。在关闭读取句柄之前,删除打开读取的文件不会删除该文件。