【问题标题】:How to Limit Connections for user如何限制用户的连接
【发布时间】:2011-11-23 20:59:33
【问题描述】:

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

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

【问题讨论】:

    标签: php apache .htaccess


    【解决方案1】:

    我强烈推荐在 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" );
    }
    ?>
    

    【讨论】:

    • 好吧,我必须限制每个文件的连接,而不是每个 ip ?我理解你的概念,这很好,但仍有一些不足之处
    • @ash – 当您暂停下载时,它会中止连接并保存它已经收到的数据。这将调用 download_ended 函数。如果您隐式包含该文件,那么要恢复下载将需要在 PHP 中添加一些额外的代码。当下载恢复时,它会检查它有多少字节,并在请求中发送一个“Range”标头,告诉你的服务器从哪个字节范围开始,所以它会在你已经收到数据后继续获取数据。希望这是有道理的
    • 你是对的,实际上需要文件不是一个文件,它是一个远程文件,我不应该使用 db 我正在使用 md5(fileid.ip) 作为下载它并为日志创建一个临时文件.但是我怎么知道用户已经下载了 100%,所以我可以删除日志并删除远程文件。
    • 创建一个“unlink”(删除)文件的函数,并使用该函数的名称调用 register_shutdown_function。这将在下载暂停/停止/完成时删除该文件,并且应在文件启动/恢复时创建该文件。
    • 哇,你的想法很棒。谢谢 。但我必须向远程服务器发送请求以删除该文件,因为该文件是从远程位置流式传输的。当用户完成下载时,我应该向他们发送一些请求,但不是在恢复/暂停下载时。这对我来说非常重要,请帮忙。谢谢
    【解决方案2】:

    限制同时下载的数量:

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

    顺便说一句:这与 mod-rewrite 无关

    【讨论】:

    • 其实主页是 download.php?fileid= 但我把它改成了 files/fileid/filename 看起来更好,需要 mod-rewrite 。无论如何,这个 limitpconn 会限制来自该 ip 的全局连接或来自每个文件的 coonection 吗?
    【解决方案3】:

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

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

    我在这里面临几乎完全相同的问题,因为如果用户在 IDM 中添加文件,每个连接都会消耗约 15MB 的 RAM,并且会降低网站速度。我已经限制了 MaXClients,但如果您找到任何好的解决方案,请分享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 2011-06-04
      • 2022-08-20
      • 2017-04-04
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多