2011-11-23 34 views
0

我正在製作一個下載腳本,用於從他們無權訪問的某些站點下載文件。我還必須提供簡歷支持,但作爲IDM和許多新的下載管理器使用8-16連接或甚至更多。我發現大多數用戶對每個文件都使用20-25個連接。我必須提供無限的文件下載和速度,但也限制每個文件的連接。我可以減慢負載並且用戶不會遇到問題。如何限制用戶連接

我很困惑該怎麼做。它可以使用htaceess完成嗎?我還以爲我可以做一些連續的日誌,但我仍然感到困惑。

回答

3

我會強烈建議limitipconn.c Apache服務器上。

http://dominia.org/djao/limitipconn.html 

使用的一個例子是

<IfModule mod_limitipconn.c> 
    <Location /your-download-directory> 
      MaxConnPerIP 3 
    </Location> 
</IfModule> 

如果你更喜歡解決這個問題,PHP和數據庫(比如MySQL在本例中使用)

<?php 
// Allow this amount of concurrent connections 
$max_connections = 100; 

// User's IP 
$user_ip = $_SERVER['REMOTE_ADDR']; 

// Sanitized file name 
$current_download = mysql_real_escape_string('download-file.zip'); 

$query_count = mysql_query("SELECT COUNT(*) FROM connections WHERE user_ip = '{$user_ip}'"); 

// Amount of concurrent connections this user has running 
list($current_connections) = mysql_fetch_array($current_connections_query); 

if($current_connections < $max_downloads) { 
    // Insert this connection to database 
    mysql_query("INSERT INTO connections (user_ip, current_download) VALUES('{$user_ip}','{$current_download}')"); 

    // This will remove this connection from the database when script finished 
    register_shutdown_function('download_ended'); 

    // your code to download file goes here ... 
} 

else { 
    // your code to run when user has maximum concurrent connections 
    exit; 
} 

// Removes download session from database 
function download_ended() { 
    global $current_download, $user_ip; 

    // Session complete, subtract one 
    mysql_query("DELETE FROM connections WHERE current_download = '{$current_download}' AND user_ip = '{$user_ip}' LIMIT 1"); 
} 
?> 
+0

以及我不得不限制連接每個文件不是每個IP反正你的觀點是好的任何使它與此,但如果用戶暫停下載將download_ended函數將調用該時間也完成任何響應後在線?我瞭解你的概念,它是好的,但仍有一些cunfusion –

+0

@ash - 當你暫停下載時,它會中止連接並保存已經收到的數據。這將調用download_ended函數。如果您隱式包含文件,要想恢復下載,需要在PHP中添加一些額外的代碼。當下載恢復時,它會檢查它有多少字節,並在請求中發送一個「範圍」標題,告訴你的服務器什麼字節範圍開始,所以它繼續獲取你已經收到的數據的數據。希望這是有道理的 –

+0

你是對的,實際上require文件不是文件,它是一個遠程文件,我不應該使用db我使用md5(fileid.ip)作爲下載它併爲日誌創建一個臨時文件。但我怎麼知道用戶已經下載了100%,所以我可以刪除日誌並刪除遠程文件。 –

1

限制同時下載的數量:

http://dominia.org/djao/limitipconn.html 
http://dominia.org/djao/limitipconn2.html 

BTW:這有什麼好做與國防部重寫

+0

實際上,主頁面是download.php?fileid =但我讓它的文件/ fileid /文件名看起來更好,需要mod-rewrite。反正這個limitpconn會限制來自每個文件的ip或連接的全局連接嗎? –

0

http://dominia.org/djao/limitipconn2.html

默認情況下,代理服務器後面的所有客戶端都被視爲來自 代理服務器的IP地址。如果你想改變這種行爲, 使用Apache 2.4中包含的mod_remoteip模塊。

我面對幾乎完全同樣的問題在這裏,因爲如果用戶將在IDM文件,每個連接消耗〜的RAM 15MB,它會減慢網站。我限制了MaXClients,但是如果你找到任何好的解決方案,那麼請分享。