HTTP文件下载:监控下载进度

时间:2013-10-22 18:23:50

标签: javascript php apache http x-sendfile

我遇到的情况是,我必须从Web服务器下载大文件(最多4GB):Apache 2.4.4通过HTTP协议。我尝试了几种方法,但最好的解决方案是使用X-SendFile模块。

当我提供文件上传的进度条时,我需要具有相同的文件下载功能。所以这是我的问题:

  • 有没有办法,包括解决方法,来实现文件下载进度监控?
  • 有没有办法,包括解决方法,来计算文件下载传输速度?
  • 是否有更好的方法从Web服务器提供高效的文件下载,而不是使用X-Sendfile模块?

一般来说是否有更好的文件下载选项,这可以让我监控文件下载进度?它可以是客户端(JavaScript)或服务器解决方案(PHP)。是否有任何特定的Web服务器允许这样做?

目前我使用:

  • Apache 2.4.4
  • Ubuntu的

多次感谢。

4 个答案:

答案 0 :(得分:4)

2个想法(未经验证):

<强>首先

而不是在页面上放置常规链接到文件(您要下载的文件),而不是像... / dowanload.php这样的链接,这可能看起来像这样:

<?php

    // download.php file
    session_start(); // if needed

    $filename = $_GET['filename']);

    header( 'Content-type: text/plain' ); // use any MIME you want here
    header( 'Content-Disposition: attachment; filename="' . htmlspecialchars($filename) . '"' );
    header( 'Pragma: no-cache' );

    // of course add some error handling

    $filename = 'c:/php/php.ini';

    $handle = fopen($filename, 'rb');

    // do not use file_get_contents as you've said files are up to 4GB - so read in chunks
    while($chunk = fread($handle, 1000)) // chunk size may depend on your filesize
    {
        echo $chunk;
        flush();
        // write progress info to the DB, or session variable in order to update progress bar
    }

    fclose($handle);
?>

这样您就可以继续关注下载过程。在此期间,您可以将进度信息写入DB / session var并使用AJAX从DB / session var更新进度条读取状态,当然轮询读取进度信息的脚本。

这是非常简化的,但我认为它可能会按你的意愿运作。

<强>第二

Apache 2.4内置了Lua语言:

我打赌你可以尝试编写LUA Apache处理程序,它将监视你的下载 - 使用PHP / AJAX从数据库发送进度到DB并更新进度条。

同样 - 有perl甚至python的模块(但不是win)

答案 1 :(得分:2)

我看到主要问题: 在php + apache解决方案中,输出缓冲可以放在几个地方:

  

浏览器&lt; = 1 =&gt; Apache&lt; = 2 =&gt; PHP处理程序&lt; = 3 =&gt; PHP口译员   过程

您需要控制第一个缓冲区。但直接来自PHP,这是不可能的。

可能的解决方案:

1)你可以编写自己的迷你守护进程,主要功能只是发送文件,例如在80端口8880以外运行。并从那里处理下载文件和监视输出缓冲区。 您的输出缓冲区只有一个,您可以控制它:

  

浏览器&lt; = 1 =&gt; PHP解释器进程

2)你也可以直接从apache中获取mod_lua和控制输出缓冲区。

3)你也可以使用nginx并使用内置的perl来控制nginx输出缓冲区(它是稳定的)

4)尝试使用PHP Built-in web server并直接控制php输出缓冲区。抱歉,我不能说它是如何稳定的。但你可以试试。 ;)

我认为nginx + php +内置perl是更稳定和强大的解决方案。 但您可以选择并可能在该列表中使用其他解决方案。我会关注这个话题,并感兴趣地等待你的最终解决方案。

答案 2 :(得分:2)

短时间内读取和写入数据库会导致性能下降。

我建议使用会话(递增循环中发送数据的值),您可以通过另一个php文件安全地关闭它,您可以将数据作为JSON返回,可以由javascript函数/插件使用。< / p>

答案 3 :(得分:-1)

如果您使用php版本&gt; = 5.4,那么这可以帮助您http://www.php.net/manual/en/session.upload-progress.php

相关问题