【问题标题】:PHP on IIS 7.5 - Large file download blocks connection until download is completeIIS 7.5 上的 PHP - 大文件下载会阻止连接,直到下载完成
【发布时间】:2012-12-11 10:39:09
【问题描述】:

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

我正在使用 fopen()、feof() 和 fread() 的组合来下载块中的文件。

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

我正在使用安装在 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();
    }
}

【问题讨论】:

  • 您在下载中使用会话吗?
  • 你的代码有错误,在filename.mp4'后面加一个"
  • 引用错误仅在本例中。在实际代码中是正确的。我现在已经在 sn-p 中修复了它。
  • @Pekka 下载功能不依赖于会话的任何使用,如果这就是你的意思的话。
  • 该代码似乎没有使用会话,但您能否验证session.auto_start 设置已关闭?

标签: php iis download


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2016-01-17
    • 2012-03-04
    相关资源
    最近更新 更多