2012-10-15 13 views
7

私は、ダウンロード再開で大きなファイルをダウンロードできるようにするPHPスクリプトを持っています。ダウンロード - ユーザーあたりの最大接続数は?

これは問題なく動作しますが、ダウンロード速度はPHPコードで200kb/sに制限されています。

Mozillas Firefoxのダウンロードマネージャは1つの接続しか作成せず、速度は約200kb/sですが、Free-Download-ManagerまたはJDownloaderは2から4の接続をするため、ダウンロード速度は(200Kb/s * 2または4 )= 400~800kb/s。

これをやめて、すべてのユーザーがこのファイルをダウンロードできる接続を1つだけ許可するにはどうすればよいですか。

+0

最初の接続が行われたときに無効になるセッションIDを生成する方法があります。 – nkr

+0

あなたは何とかユーザーを特定し、ダウンロードするのではなくユーザーごとに*を制限する必要があります。 – nalply

+0

大丈夫また、セッションID、IPアドレス、mysqlデータベースなどでこれを行うことが可能なのはPHPだけです。その大丈夫ですが、私はそれが.htacessや他のものよりも可能だと思いました... –

答えて

7

。私はあなたのための最初のものはContent-Rangeを無効にすることだと思います。..

14.16 Content-Range

のContent-レンジエンティティヘッダは、どこフルエンティティボディ内部分を指定する部分エンティティボディに送られます体を適用する必要があります。範囲単位はセクション3.12で定義されています。

ダウンロードマネージャは、あなたがこれを無効にした場合download resumeまたはmultiple connections両方が単一のファイルに作ることができません...ので、範囲の2または複数の接続では、単一の罰金をダウンロードすることができます。彼らはあなたにも14.35.1 Byte Ranges

Bを見るべき最初

LoadModule headers_module modules/mod_headers.so 
Header set Accept-Ranges none 
RequestHeader unset Range 

からファイル先頭にすべての要求になるだろう。ダウンロードセッションを紹介してください。

ダウンロードごとにuniqid idを生成し、PHPページから配信することができます。ダウンロードがまだアクティブであるか、要求されている場合は、あなただけの

$realFile = "test.pdf"; 
$fakeFile = uniqid("file"); 

$uniqid = isset($_REQUEST['id']) ? $_REQUEST['id'] : null; 
if (empty($uniqid) || strlen($uniqid) < 20 || !ctype_xdigit($uniqid)) { 
    die("Die! Die! Die! Stolen URL"); 
} 
$memcache = new \Memcache(); 
$memcache->connect('localhost', 11211); 

$runtime = (int) $memcache->get($uniqid); 

if ($runtime) { 
    die("Die! Die! Die! You Multiple Down loader"); 
} else { 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n"); 
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-disposition: attachment; filename=$fakeFile.pdf"); // 
    header('Content-type: application/pdf'); 
    header("Content-length: " . filesize($realFile)); 
    readfile($realFile); 
    $memcache->set($uniqid, 1); 
} 

単純なクライアント

$url = "a.php?id=" . bin2hex(mcrypt_create_iv(30, MCRYPT_DEV_URANDOM)); 
printf("<a href='%s'>Download Here</a>",$url); 

ページを存在する前に、それはあなた

<a href='a.php?id=aed621be9d43b0349fcc0b942e84216bf5cd34bcae9b0e33b9d913cccd6e'>Download Here</a> 

のような出力に何かを希望特定のファイルに各IDをマップする必要もあります...

関連する問題