對不起,標題!我有一個網站有很多PDF文件和有限的每月帶寬。我想實現的(用PHP)是一種限制每個用戶($_SESSION
?)達到某個限制的方法 - 比如說50MB,並且當他們點擊下載另一個文件時,他們會被重定向到一個拒絕任何下載的網頁(接下來的24小時,說)。限制用戶從網站下載的金額,並在達到限制時重定向?
這可能嗎?我不確定我的下載「計數器」是否只能計算.pdf
文件(如果達到限制,我不想讓瀏覽器訪問網站的訪問者)。任何psuedo代碼將不勝感激。
對不起,標題!我有一個網站有很多PDF文件和有限的每月帶寬。我想實現的(用PHP)是一種限制每個用戶($_SESSION
?)達到某個限制的方法 - 比如說50MB,並且當他們點擊下載另一個文件時,他們會被重定向到一個拒絕任何下載的網頁(接下來的24小時,說)。限制用戶從網站下載的金額,並在達到限制時重定向?
這可能嗎?我不確定我的下載「計數器」是否只能計算.pdf
文件(如果達到限制,我不想讓瀏覽器訪問網站的訪問者)。任何psuedo代碼將不勝感激。
如果你把所有的下載經歷一個PHP腳本:
<a href="download.php?file='filename.pdf'" />
你可以做幾乎任何你想要的。該PHP文件可以提供所有文件(使它們遠離webroot),寫入_SESSION,並可以執行重定向。請享用。
我可能會遠離這個會話。會話易變,易受各種瀏覽器行爲影響。例如,在Firefox中,如果會話已初始化,我可以關閉Firefox,訪問同一站點,並且會話仍處於活動狀態。然而,在IE中,如果我打開多個選項卡並訪問同一個站點,則每個選項卡式實例都會獲得一個新的會話ID。
我建議設置一個用戶必須登錄到您的網站的帳戶系統。然後,您可以在帳戶級別跟蹤他們的下載量,這將在多個會話之間保持不變。
如果您已有用戶系統,我會建議將所有信息存儲在用戶配置文件中。
因此,如果他刪除所有的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...
}
我認爲你正試圖避免強迫用戶在你的網站上註冊,當你試圖每位訪問者的帶寬來追蹤是不切實際與常見的方式(餅乾,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小時重置一次。
創建一個表來存儲計數下載
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
}
?>
感謝您的答覆。我沒有一個用戶系統,它似乎超出了網站的範圍/大小,但我會記住它。我想這會導致SESSION/IP限制(儘管Digital Precision的警告)。在僞代碼方面,誰能給我一些想法?我認爲download.php?file ='foo.pdf'download.php檢查IP,恢復SESSION,獲取文件大小與限制相比,並允許/拒絕下載。但是如何在一天之後清除SESSION?其餘的是否合理? – rwb