IIS 7.5上的PHP - 大文件下载阻止连接,直到下载完成

时间:2012-12-11 10:39:10

标签: php iis download

我想允许用户下载大型视频文件。出于安全原因,这些文件位于公用文件夹之外。

我使用fopen(),feof()和fread()的组合在chuncks中下载文件。

下载工作正常。该视频已下载,也可以正常使用。问题出在下载过程中。下载文件的任何用户都无法继续浏览网站,直到下载文件为止。浏览器正在尝试建立连接,但在文件下载时它会挂起。下载完成后,立即建立连接。其他用户可以在下载过程中浏览网站,因此它不像整个服务器挂起或其他什么。

我正在使用安装在IIS服务器上的PHP(CakePHP)。

一段代码:

$name = "filename.mp4";
$folder = "private/folder/";

$handle = fopen($folder.$name, "rb");

if(!$handle)
{
    echo "File not found";
}
else
{
    header("Content-length:".filesize($folder.$name));
    header("Content-Type: video/mp4");
    header("Content-Disposition: attachment; filename='filename.mp4'");
    header("Content-Transfer-Encoding: binary");

    session_write_close(); // this is the solution  

    while(!feof($handle))
    {
        $buffer = fread($handle, 1*(1024*1024));
        echo $buffer;
        ob_flush();
        flush();
    }
}

1 个答案:

答案 0 :(得分:3)

我终于解决了这个问题。如上所述,问题确实与会话有关。尽管session.auto_start已关闭,但CakePHP本身正在处理会话。因此,通过在while循环之前插入session_write_close(),问题就解决了。