我正在製作一個下載腳本,用於從他們無權訪問的某些站點下載文件。我還必須提供簡歷支持,但作爲IDM和許多新的下載管理器使用8-16連接或甚至更多。我發現大多數用戶對每個文件都使用20-25個連接。我必須提供無限的文件下載和速度,但也限制每個文件的連接。我可以減慢負載並且用戶不會遇到問題。如何限制用戶連接
我很困惑該怎麼做。它可以使用htaceess完成嗎?我還以爲我可以做一些連續的日誌,但我仍然感到困惑。
我正在製作一個下載腳本,用於從他們無權訪問的某些站點下載文件。我還必須提供簡歷支持,但作爲IDM和許多新的下載管理器使用8-16連接或甚至更多。我發現大多數用戶對每個文件都使用20-25個連接。我必須提供無限的文件下載和速度,但也限制每個文件的連接。我可以減慢負載並且用戶不會遇到問題。如何限制用戶連接
我很困惑該怎麼做。它可以使用htaceess完成嗎?我還以爲我可以做一些連續的日誌,但我仍然感到困惑。
我會強烈建議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");
}
?>
限制同時下載的數量:
http://dominia.org/djao/limitipconn.html
http://dominia.org/djao/limitipconn2.html
BTW:這有什麼好做與國防部重寫
實際上,主頁面是download.php?fileid =但我讓它的文件/ fileid /文件名看起來更好,需要mod-rewrite。反正這個limitpconn會限制來自每個文件的ip或連接的全局連接嗎? –
http://dominia.org/djao/limitipconn2.html
默認情況下,代理服務器後面的所有客戶端都被視爲來自 代理服務器的IP地址。如果你想改變這種行爲, 使用Apache 2.4中包含的mod_remoteip模塊。
我面對幾乎完全同樣的問題在這裏,因爲如果用戶將在IDM文件,每個連接消耗〜的RAM 15MB,它會減慢網站。我限制了MaXClients,但是如果你找到任何好的解決方案,那麼請分享。
以及我不得不限制連接每個文件不是每個IP反正你的觀點是好的任何使它與此,但如果用戶暫停下載將download_ended函數將調用該時間也完成任何響應後在線?我瞭解你的概念,它是好的,但仍有一些cunfusion –
@ash - 當你暫停下載時,它會中止連接並保存已經收到的數據。這將調用download_ended函數。如果您隱式包含文件,要想恢復下載,需要在PHP中添加一些額外的代碼。當下載恢復時,它會檢查它有多少字節,並在請求中發送一個「範圍」標題,告訴你的服務器什麼字節範圍開始,所以它繼續獲取你已經收到的數據的數據。希望這是有道理的 –
你是對的,實際上require文件不是文件,它是一個遠程文件,我不應該使用db我使用md5(fileid.ip)作爲下載它併爲日誌創建一個臨時文件。但我怎麼知道用戶已經下載了100%,所以我可以刪除日誌並刪除遠程文件。 –