2011-02-18 57 views
1

我創建了一個用戶可以上傳圖像的網站,我想記錄單個圖像的瀏覽總數。實現圖像瀏覽次數的有效方法 - PHP

現在我的想法實現,這是:

在會話中存儲訪問者的ip地址,FE:

$key = "view_img_".$img->id; 
if(!isset($_SESSION[$key])) 
{ 
    $_SESSION[$key] = array(); 
} 

$visitorIpAddress = $_SERVER['REMOTE_ADDRESS']; 

$found = false; 

foreach($ip in $_SESSION[$key]) 
{ 
    if($ip == $visitorIpAdress) 
    { 
     $found = true; //visitor has visited before in the livespan of this session 
     break; 
    } 
} 

if(!$found) 
{ 
    //do sql update query for the number of views for this image 
    $sql = mysql_query("UPDATE ") //etc. 

    //Add this ip to the list in the session 
    $_SESSION[$key][] = $visitorIpAdress; 
} 

現在我的問題是這樣的:

我想它清除訪問者在$ _SESSION [$ key]變量中的ipaddress,並在一定的時間限制後清除資源。

事情是:
大多數訪問者可能只能查看圖像一次,當某個圖像變老時,可能不再訪問,但會話仍然存在。

有沒有一種方法來定義一個特定的$ _SESSION變量的壽命,所以它重置自己? (等於$ _SESSION [$ key] = null)

或者會有更好的方法來實現這個嗎?

+3

雖然你可以* *做到這一點在PHP中,它真的不是一個好主意,這樣做。幾乎每臺服務器都有內置的功能強大,可靠,經過充分測試的日誌記錄功能,並且有數十種成熟的工具可用於從統計分析中提取這些日誌中的數據。我建議與他們中的一個集成並且避免自己造成的DDoS攻擊(想象一下,幾個28kbps調制解調器請求大圖像並且您的進程已被停用)。 – coreyward 2011-02-18 09:37:19

回答

1

您通過會話計數的方法是唯一視圖的數量。如果你只是想計算的若干意見,不要把太多的大腦和完全類似的查詢:

UPDATE counttable SET Views = Views + 1 Where ImageID = 123 

填充圖像標識,你是好去。吻。

+1

這不會這樣做,因爲這不會使每個ipaddress的視圖在每個圖像的一定時間內都是唯一的。 – Robin 2011-02-18 09:50:58

0

看來,你不明白,很清楚PHP會議是如何工作的:

  • 每個會話是單獨爲每個用戶
  • 從用戶的角度,每個會話的生活 只有等到用戶正在與 網站。當瀏覽器關閉時, 會話cookie被刪除,會話 終止。
  • 會議可能會提前終止 如果PHP設置中定義會話壽命到期

所以,如果你願意存儲的觀點在會議上,你只會被存儲在這個特定的觀點對於當前用戶數時刻。如果要存儲訪問的總次數,則需要使用數據庫或其他外部數據存儲。例如,對於圖像的表可能有views列,您可以在每次訪問後遞增它:

UPDATE images SET views = views + 1 WHERE id = 123 
+1

我想實現的是防止更新查詢,當有人一直按f5增加圖像的視圖數量。 因此,如果我理解正確,我應該在會話中存儲用戶的IP地址並檢查其上次訪問以查明是否更新數據庫中的視圖? – Robin 2011-02-18 09:48:35