如何限制用户的连接

时间:2011-11-23 20:59:33

标签: php apache .htaccess

我正在制作一个下载脚本,用于从他们无法访问的某些网站下载文件。我还必须提供简历支持,但IDM和许多新的下载管理器使用8-16连接甚至更多。我发现大多数用户对每个文件使用20-25个连接。我必须提供无限的文件下载和速度,但限制每个文件的连接。我可以减慢负载,用户也没有问题。

我很困惑怎么做。可以用htaceess完成吗?另外我以为我可以通过制作一些连续的日志来做到这一点,但我仍然感到困惑。

3 个答案:

答案 0 :(得分:3)

我强烈建议在Apache服务器上使用limitipconn.c

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" );
}
?>

答案 1 :(得分:1)

限制同时下载的次数:

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

BTW:这与mod-rewrite无关

答案 2 :(得分:0)

  
    

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

         

默认情况下,代理服务器后面的所有客户端都被视为来自        代理服务器的IP地址。如果您想改变这种行为,        使用Apache 2.4中包含的mod_remoteip模块。

  

我在这里遇到几乎完全相同的问题,因为如果用户在IDM中添加文件,每个连接消耗大约15MB的RAM并且它会减慢站点的速度。我限制了MaXClients,但如果你找到任何好的解决方案,请分享。