PHP文件下载问题:当用户取消下载然后重试时,服务器冻结几分钟

时间:2011-09-29 00:27:17

标签: php download

我正在使用以下PHP脚本下载20mb文件:

(文件路径和文件名在脚本中先前设置)

$fullPath = $filepath.$filename;

if ($fd = fopen($fullPath, "r")) {  
        // http headers for zip downloads
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-type: application/octet-stream");
        header("Content-Disposition: attachment; filename=\"".$filename."\"");
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".filesize($fullPath));
            while(!feof($fd)) {
            echo(fread($fd, 1024*8));
            flush();
            if (connection_status()!=0) {
                fclose($fd);
                die();
            }
        }
    }
fclose($fd);
exit();

如果下载完成,它可以正常工作,但是如果用户取消了下载,并且他们点击链接重新下载,则服务器几分钟内完全没有响应,然后下载将开始。看起来它正在等待脚本超时...但是不是“if(connection_status()!= 0)...”部分应该打开脚本吗?

非常感谢任何帮助!提前谢谢!

1 个答案:

答案 0 :(得分:-1)

我认为你在某种程度上过度设计了你的解决方案。尝试使用readfile()而不是fopen / fread循环。

更好的是,除非有令人信服的理由说明为什么需要PHP来调解文件传输,所以根本不要使用PHP脚本,只需提供指向相关文件的直接链接即可。

最好的代码始终是您不必编写的代码。