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 用ではありません)。