2011-12-07 21 views
2

對不起,標題!我有一個網站有很多PDF文件和有限的每月帶寬。我想實現的(用PHP)是一種限制每個用戶($_SESSION?)達到某個限制的方法 - 比如說50MB,並且當他們點擊下載另一個文件時,他們會被重定向到一個拒絕任何下載的網頁(接下來的24小時,說)。限制用戶從網站下載的金額,並在達到限制時重定向?

這可能嗎?我不確定我的下載「計數器」是否只能計算.pdf文件(如果達到限制,我不想讓瀏覽器訪問網站的訪問者)。任何psuedo代碼將不勝感激。

回答

4

如果你把所有的下載經歷一個PHP腳本:

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

你可以做幾乎任何你想要的。該PHP文件可以提供所有文件(使它們遠離webroot),寫入_SESSION,並可以執行重定向。請享用。

0

我可能會遠離這個會話。會話易變,易受各種瀏覽器行爲影響。例如,在Firefox中,如果會話已初始化,我可以關閉Firefox,訪問同一站點,並且會話仍處於活動狀態。然而,在IE中,如果我打開多個選項卡並訪問同一個站點,則每個選項卡式實例都會獲得一個新的會話ID。

我建議設置一個用戶必須登錄到您的網站的帳戶系統。然後,您可以在帳戶級別跟蹤他們的下載量,這將在多個會話之間保持不變。

2

如果您已有用戶系統,我會建議將所有信息存儲在用戶配置文件中。

因此,如果他刪除所有的cookies和relogins就沒有問題!

對於客人,我會推薦驗證碼和基於會話或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... 
} 
+0

感謝您的答覆。我沒有一個用戶系統,它似乎超出了網站的範圍/大小,但我會記住它。我想這會導致SESSION/IP限制(儘管Digital Precision的警告)。在僞代碼方面,誰能給我一些想法?我認爲download.php?file ='foo.pdf'download.php檢查IP,恢復SESSION,獲取文件大小與限制相比,並允許/拒絕下載。但是如何在一天之後清除SESSION?其餘的是否合理? – rwb

0

我認爲你正試圖避免強迫用戶在你的網站上註冊,當你試圖每位訪問者的帶寬來追蹤是不切實際與常見的方式(餅乾,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小時重置一次。

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 

} 



?>