我想添加一个独特的点击计数器到我的网站使用PHP。此计数器将为数据库中的每个页面保存访问者的IP。我有这样的数据库结构:
表hits有两列:
ip
page_url我的问题是:在PHP文件中获得访问者的IP之后,哪个更好(性能更好)?
。
发布于 2012-01-18 00:22:29
如果您使用的是MySQL,则可能要滥用主键和重复密钥更新的组合:
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();发布于 2012-01-18 00:21:50
假设你对简单的编程很满意。
并不是真正的“实时”,但几乎实时强烈建议您用自己的格式将日志写入文本文件(如果您对[customlog][1]特性不满意的话)。
然后,每5分钟设置一次cronjob,如果您想接近"live",甚至每1分钟设置一次,将文本导入到MySql临时表中,大口吞下LOAD DATA INFILE,然后根据ip组更新访问计数表。
完全实时,这可能会对服务器造成巨大的拖累,但考虑到您的流量很小,只需在MySQL中创建两个表即可。一个只是记录被读取的文章/页面ID + IP +时间(日志表)。另一个包含文章/页面ID和访问计数--其中的计数是第一个表中ip更新的组。
发布于 2015-04-26 10:07:14
在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();
https://stackoverflow.com/questions/8903477
复制相似问题