[英]Getting unique hit count in php
我想使用PHP為我的網站添加一個獨特的點擊計數器。 此計數器將為數據庫中的每個頁面保存訪問者的IP。 我有這樣的數據庫結構:
表hits
兩列:
ip
page_url
我的問題是:在PHP文件中獲取訪問者的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
為什么這個?
您可能還想記錄上次訪問的時間戳:
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。
我會在( ip
, page_url
)上使用唯一鍵,可選擇date
。 如果記錄不存在則會創建,否則會導致錯誤(但您可以輕松檢查錯誤代碼)或者您可以在INSERT
語句中使用IGNORE
。
它只需要一個數據庫請求,可能是最快的。 您還可以自動保證所有記錄都是唯一的,您不需要使用事務。
嗨約翰和其他流程偷看......我是編程和MYSQL的新手,...但是我繞過它的方式如下:
我使用一些PHP代碼來查詢命中數據庫然后評估列, ip
和page_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.