限制用户从网站下载的金额,并在达到限制时重定向?

时间:2011-12-07 17:37:30

标签: php download limit

抱歉这个含糊不清的标题!我的网站有很多PDF文件,每月带宽有限。我希望实现(在PHP中)是一种限制每个用户($_SESSION?)到某个限制的方法 - 比如说50MB,超过当他们点击下载另一个文件时他们会被重定向到一个网页否认任何进一步的下载(比如说接下来的24小时)。

这可能吗?我不确定我的下载“计数器”是否只能计算.pdf个文件(如果达到限制,我不希望阻止访问者浏览网站)。任何伪代码都将非常感激。

5 个答案:

答案 0 :(得分:4)

如果您的所有下载都通过一个php脚本:

<a href="download.php?file='filename.pdf'" />

你可以做任何你想做的事情。那个php文件可以传递你的所有文件(让它们远离webroot),写入你的_SESSION,它可以执行你的重定向。享受。

答案 1 :(得分:2)

如果您已有用户系统,我建议您在用户个人资料中存储所有信息。

所以如果他删除了所有的cookie并重新登录就没问题了!

对于来宾,我建议使用验证码和会话或基于IP的限制。

// Pseudo code
// download.php

function UserHasReachedLimit($file)
{
  $info = $Database->QueryUserInfo('limit');
  $max = $Database->GetLimitForFile($file);

  if ( $info[$file] > $max )
    return false;
  else 
    return true;
}

if ( IsUser() )
{
  if ( UserHasReachedLimit() )
    error();
  else
    download();
}
else // guest
{
  // session or IP based restrictions...
}

答案 2 :(得分:0)

我可能会远离会议。会话易变,易受各种浏览器行为的影响。例如,在Firefox中,如果会话已初始化,我可以关闭Firefox,访问同一站点,并且会话仍处于活动状态。但是在IE中,如果我打开多个选项卡并访问同一个站点,则每个选项卡式实例都会获得一个新的会话ID。

我建议您设置一个帐户系统,用户必须登录您的网站。然后,您可以在帐户级别跟踪其下载量,这将在多个会话之间保持不变。

答案 3 :(得分:0)

我认为你试图避免强迫用户在你的网站上注册,而你试图跟踪每个访问者的带宽是不切实际的常见方式(cookies,ip ...)。所以,最好的方式(在我看来,当然有许多改进的解决方案)是制作一个简单的注册表格,比如姓名,密码和电子邮件,每个电子邮件都设置一个激活系统来保护您的网站免受用户侵害,现在每个用户登录并尝试下载文件,您按以下步骤处理他的请求:

1)用户请求文件名.pdf(检查其可用性和大小(重要))。

2)检查用户带宽:

$query = sql_query("SELECT Bandwidth, LastDownload FROM Users, Stats WHERE USER_ID=5");
$result = sql_fetch($query);
if ($result['Bandwidth'] < 50M)
showDownloadLink();
else if($result['LastDownload'] - currentTime() !=0)
echo "please wait to the next 24h";

数据库应该是这样的: 用户:

ID_U int(key, auto increment), Name varchar(25), email varchar(255), password varchar(32), Bandwith float

统计:

ID_S int(key, auto increment), LastDownload time, ID_U integer

注意: 每次用户下载文件时,都会为正确的用户更新“带宽”行,以便稍后您可以检查特定用户是否达到其限制。你还必须在每个24小时后重置它。

这是一个通用的解决方案,许多人认为必须检查,例如计数器带宽必须每24小时重置一次。

答案 4 :(得分:0)

创建一个存储计数下载的表

CREATE TABLE IF NOT EXISTS `downloaded` (
  `ip` varchar(200) NOT NULL,
  `count` int(11) NOT NULL DEFAULT '0',
  `last_access` datetime DEFAULT NULL,
  UNIQUE KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

<?php

/*
$limit  => Number of Downloads Allowed
$period => In minutes

*/
function UserHasReachedLimit($limit, $period) {
$ip = addslashes($_SERVER['REMOTE_ADDR']);
$dl = false;
$sql = sprintf("SELECT UNIX_TIMESTAMP(last_access) last_time, count FROM downloaded WHERE ip = '%s' ORDER BY last_access DESC", $ip);
$res = mysql_query($sql);

if (mysql_num_rows($res) > 0) { // There is a registered IP already
    $last_xs = mysql_result($res, 0, 'last_time');
    $last_xs += $last_xs+$period * 60;
    $count = mysql_result($res, 0, 'count'); // number of downloads by this ip
    if ($count == $limit && $last_xs > time()) { // we check if downloads reached in this period
    $dl = true;
    } else {
    $sql = sprintf("UPDATE downloaded SET count = CASE WHEN count >= %s THEN 0 ELSE count+1 END, last_access=now() WHERE ip ='%s'", $limit+1, $ip);  // we just update download count + 1
    mysql_query($sql);
    }
    } else { // There is not a registered IP and we create it
    $sql = sprintf("INSERT INTO downloaded VALUES ('%s', '0', NOW());", $ip); mysql_query($sql);
    }
return $dl;
}


/*
Usage
*/
$limit = 2;
$period = 2;
if(UserHasReachedLimit($limit, $period) == true) {
// User reached number of 2 downloads in 2 minutes

} else {
// Continue downloading

}



?>