我正在制作一个下载脚本,用于从他们无法访问的某些网站下载文件。我还必须提供简历支持,但IDM和许多新的下载管理器使用8-16连接甚至更多。我发现大多数用户对每个文件使用20-25个连接。我必须提供无限的文件下载和速度,但限制每个文件的连接。我可以减慢负载,用户也没有问题。
我很困惑怎么做。可以用htaceess完成吗?另外我以为我可以通过制作一些连续的日志来做到这一点,但我仍然感到困惑。
答案 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,但如果你找到任何好的解决方案,请分享。