Как ограничить количество подключений для пользователя - PullRequest
0 голосов
/ 24 ноября 2011

Я создаю сценарий загрузки, который будет использоваться для загрузки файлов с некоторых сайтов, к которым у них нет доступа. Я также должен обеспечить поддержку возобновления, но, поскольку IDM и многие новые менеджеры загрузки используют 8-16 соединений или даже больше. Я обнаружил, что большинство пользователей используют 20-25 соединений для каждого файла. Я должен обеспечить неограниченную загрузку файлов и скорость, но ограничить подключения для каждого файла. Я могу замедлить загрузку, и у пользователей нет проблем с этим.

Я запутался, как это сделать. Можно ли это сделать с помощью htaceess? Кроме того, я думал, что смогу сделать это, ведя непрерывный журнал, но я все еще в замешательстве

Ответы [ 3 ]

3 голосов
/ 24 ноября 2011

Я настоятельно рекомендую 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" );
}
?>
1 голос
/ 24 ноября 2011

Ограничение количества одновременных загрузок:

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

Кстати: это не имеет ничего общего с mod-rewrite

0 голосов
/ 30 ноября 2013

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

По умолчанию все клиенты за прокси обрабатываются как поступающие из IP-адрес прокси-сервера. Если вы хотите изменить это поведение, используйте модуль mod_remoteip, включенный в Apache 2.4.

Здесь я сталкиваюсь практически с той же проблемой, потому что, если пользователь добавляет файл в IDM, каждое соединение потребляет ~ 15 МБ ОЗУ, и это замедляет работу сайта. Я ограничил число клиентов MaXClients, но если вы найдете какое-либо хорошее решение, поделитесь им.

...