5

HTTP プロトコル経由の Apache 2.4.4 という Web サーバーから大きなファイル (最大 4GB) のダウンロードを実装する必要がある状況にあります。いくつかのアプローチを試しましたが、最善の解決策は X-SendFile モジュールを使用することです。

ファイルのアップロードにプログレス バーを提供するので、ファイルのダウンロードにも同じ機能が必要です。だからここに私の質問があります:

  • ファイルのダウンロードの進行状況を監視するための回避策を含む方法はありますか?
  • 回避策を含め、ファイルのダウンロード転送速度を計算する方法はありますか?
  • X-Sendfile モジュールを使用する以外に、Web サーバーから効率的にファイルをダウンロードする方法はありますか?

一般的に、ファイルのダウンロードの進行状況を監視できる、より優れたファイル ダウンロード オプションはありますか? クライアント (JavaScript) またはサーバー ソリューション (PHP) にすることができます。これを許可する特定の Web サーバーはありますか?

現在私は使用しています:

  • アパッチ 2.4.4
  • Ubuntu

何度もありがとう。

4

3 に答える 3

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/セッション変数に進行状況情報を書き込み、進行状況情報を読み取るスクリプトをもちろんポーリングする AJAX を使用して、DB/セッション変数から進行状況バーの読み取りステータスを更新することができます。

これは非常に単純化されていますが、必要に応じて機能すると思います。

2番:

Apache 2.4 には Lua 言語が組み込まれています。

ダウンロードを監視する LUA Apache ハンドラを作成してみてください。進行状況を DB に送信し、DB から進行状況情報を取得する PHP/AJAX を使用して進行状況バーを更新します。

同様に、perl や python 用のモジュールもあります (ただし、win 用ではありません)。

于 2013-10-28T17:24:22.937 に答える
2

短い間隔でデータベースを読み書きすると、パフォーマンスが低下します。

まったく別のphpファイルで安全にオフにできるセッション(ループで送信されたデータの値をインクリメントする)を使用することをお勧めします.JavaScript関数/プラグインで使用できるJSONとしてデータを返すことができます.

于 2013-10-30T12:49:02.300 に答える
2

主な問題は次のとおりです。php + apache ソリューションでは、出力バッファリングがいくつかの場所に配置される場合があります。

ブラウザ <= 1 => Apache <= 2 => PHP ハンドラ <= 3 => PHP インタープリタ プロセス

最初のバッファを制御する必要があります。しかし、PHPから直接それは不可能です。

可能な解決策:

1) ファイルの送信のみを主な機能とする独自のミニ デーモンを作成し、たとえば 80 ポート 8880 以外で実行することができます。そして、ファイルのダウンロードを処理し、そこから出力バッファを監視します。出力バッファは 1 つだけになり、それを制御できます。

ブラウザ <= 1 => PHP インタープリタ プロセス

2) また、mod_lua を取得して、Apache から直接出力バッファーを制御することもできます。

3) また、 nginxを使用して、組み込みの perl を使用して nginx 出力バッファーを制御することもできます (安定しています)

4) PHP 組み込み Web サーバーを使用して、php 出力バッファーを直接制御してみてください。安定性についてはなんとも言えません、申し訳ありません。しかし、あなたは試すことができます。;)

nginx+php+組み込みの perl は、より安定した強力なソリューションだと思います。ただし、そのリストにない他のソリューションを選択して使用することもできます。私はこのトピックに従い、興味を持ってあなたの最終的な解決策を待っています.

于 2013-10-29T06:20:37.500 に答える