首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在php中获取唯一的命中计数

问在php中获取唯一的命中计数
EN

Stack Overflow用户
提问于 2012-01-18 00:09:34
回答 5查看 5.4K关注 0票数 4

我想添加一个独特的点击计数器到我的网站使用PHP。此计数器将为数据库中的每个页面保存访问者的IP。我有这样的数据库结构:

表hits有两列:

代码语言:javascript
复制
ip
page_url

我的问题是:在PHP文件中获得访问者的IP之后,哪个更好(性能更好)?

  1. 来检查IP地址是否已经在数据库中。当还没有在数据库中添加
  2. 时,只需添加所有访问者in (不进行重复检查),然后为相关页面获取不同的in以获得唯一的点击计数?

。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-18 00:22:29

如果您使用的是MySQL,则可能要滥用主键和重复密钥更新的组合:

代码语言:javascript
复制
CREATE TABLE hits (
ip VARCHAR(15),
page_url VARCHAR(200),
PRIMARY KEY (ip,page_url),
hitcount INT NOT NULL DEFAULT 0
)

现在在页面上点击你做的

代码语言:javascript
复制
INSERT INTO hits(ip, page_url,hitcount) VALUES('$ip','$url',1)
ON DUPLICATE KEY UPDATE hitcount=hitcount+1

为什么要这样?

  • 是另一个唯一的键,对一个写量大的表是有害的,所以要避免它。真的,
  • 插入..。在重复键更新时,只锁定一行一次

您还可能希望记录上一次访问的时间戳:

代码语言:javascript
复制
ALTER TABLE hits ADD COLUMN lastseen TIMESTAMP();
票数 6
EN

Stack Overflow用户

发布于 2012-01-18 00:21:50

假设你对简单的编程很满意。

并不是真正的“实时”,但几乎实时强烈建议您用自己的格式将日志写入文本文件(如果您对[customlog][1]特性不满意的话)。

然后,每5分钟设置一次cronjob,如果您想接近"live",甚至每1分钟设置一次,将文本导入到MySql临时表中,大口吞下LOAD DATA INFILE,然后根据ip组更新访问计数表。

完全实时,这可能会对服务器造成巨大的拖累,但考虑到您的流量很小,只需在MySQL中创建两个表即可。一个只是记录被读取的文章/页面ID + IP +时间(日志表)。另一个包含文章/页面ID和访问计数--其中的计数是第一个表中ip更新的组。

票数 2
EN

Stack Overflow用户

发布于 2015-04-26 10:07:14

在Eugen Rieck的帮助下,我用时间和日期存储完成了我的代码。

在此代码中,它存储用户ip、计数、日期和时间。

​

代码语言:javascript
复制
$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();

​

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8903477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档