簡體   English   中英

在php中獲得獨特的命中數

[英]Getting unique hit count in php

我想使用PHP為我的網站添加一個獨特的點擊計數器。 此計數器將為數據庫中的每個頁面保存訪問者的IP。 我有這樣的數據庫結構:

hits兩列:

ip
page_url

我的問題是:在PHP文件中獲取訪問者的IP后,哪個更好(性能)?

  1. 檢查IP地址是否已存在於數據庫中。 當還沒有在數據庫中添加它
  2. 只需添加所有訪問者IP(無需重復檢查),然后獲取相關頁面的不同IP以獲得唯一的命中數?

如果您使用的是MySQL,則可能需要濫用PRIMARY KEY和ON DUPLICATE KEY UPDATE的組合:

CREATE TABLE hits (
ip VARCHAR(15),
page_url VARCHAR(200),
PRIMARY KEY (ip,page_url),
hitcount INT NOT NULL DEFAULT 0
)

現在在頁面上點擊你做

INSERT INTO hits(ip, page_url,hitcount) VALUES('$ip','$url',1)
ON DUPLICATE KEY UPDATE hitcount=hitcount+1

為什么這個?

  • 另一個唯一的關鍵是POISON用於寫入繁重的表,因此請避免使用它。 真。
  • INSERT ... ON DUPLICATE KEY UPDATE僅鎖定行一次

您可能還想記錄上次訪問的時間戳:

ALTER TABLE hits ADD COLUMN lastseen TIMESTAMP();

Eugen Rieck的幫助下,我用時間和日期存儲我的代碼。

在此代碼中,它存儲用戶ip,計數,日期和時間。

 $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP'); else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED'); else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR'); else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED'); else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR'); else $ipaddress = 'UNKNOWN'; // final ip address $time=date("Y/m/d H:i:s"); // date and time in a single variable $sql = "INSERT IGNORE INTO `ipaddress` (`id`, `ipaddress`, `count`, `time`) VALUES ('', '$ipaddress','1', '$time') ON DUPLICATE KEY UPDATE count=count+1, time='".$time."'"; // adding ip,count, date and time to table if($conn->query($sql) === false) { trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->error, E_USER_ERROR); } else { $last_inserted_id = $conn->insert_id; $affected_rows = $conn->affected_rows; } $conn->close(); 

假設你對簡單的編程感到滿意。

不是真正的“實時”但是幾乎是實時強烈建議您使用自己的格式寫入日志文本文件(如果您對Apache的[customlog][1]功能不滿意)。

然后,每隔5分鍾設置一個cronjob,如果你想要接近“live”,甚至每1分鍾設置一次cronjob,將文本導入到帶有LOAD DATA INFILE的大口中的MySql臨時表中,然后根據GROUP更新你的visitcounts表通過ip。

完全實時這可能對您的服務器造成巨大拖累,但考慮到您擁有輕量級流量,只需在MySQL中創建兩個表。 一個只記錄正在讀取的文章/頁面ID + IP +時間(日志表)。 另一個包含文章/頁面ID和訪問計數 - 其中計數更新在第一個表中的GROUP BY ip。

我會在( ippage_url )上使用唯一鍵,可選擇date 如果記錄不存在則會創建,否則會導致錯誤(但您可以輕松檢查錯誤代碼)或者您可以在INSERT語句中使用IGNORE

它只需要一個數據庫請求,可能是最快的。 您還可以自動保證所有記錄都是唯一的,您不需要使用事務。

嗨約翰和其他流程偷看......我是編程和MYSQL的新手,...但是我繞過它的方式如下:

我使用一些PHP代碼來查詢命中數據庫然后評估列, ippage_url ,如果它們評估為true則不執行任何操作,否則...插入/執行Eugene Rick上面顯示的代碼...

$ip = $_SERVER['REMOTE_ADDR']; // Get IP Address.

$purl = htmlspecialchars($_GET['page_url']); // Get Page URL.

$results = $mysqli->query("select * from hits"); // Query hits table.

$row = $results->fetch_assoc(); // Fetch array and assign to $row, then evaluate with if statement.

if ($row['ip'] == $ip && $row['page_url'] == $purl) {

} else {
    $mysqli->query("insert into hits (ip,page_url,counter) values ('$ip','$purl',1) on duplicate key update counter=counter+1");
}

老實說,我沒有在多個IP地址上檢查過這個,只是我的。

然而,它為每個基於唯一的ip(我正在使用的那個)插入的URL添加到hits表中的行,並且當刷新頁面時不會增加任何插入的URL的命中數,所以我認為它有效...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM