【发布时间】:2017-07-24 08:36:28
【问题描述】:
我正在尝试为画廊页面浏览量创建一个简单的唯一 IP 计数器。
我的想法是将视图记录与 2 个表中的图像记录分开。
数据库表
画廊
持有图片:id、name、category、views 列
unique_ips
持有访客ip 以查看图片name
此示例屏幕截图显示 3 位访问者每人查看 3 张图片。我使用了免费的代理 ips。
查看计数器
如果检测到新 IP:
将name+ip 添加到unique_ips。
递增gallery → name → views +1。
$name = "Image 1";
$ip = getenv('REMOTE_ADDR');
// Increment Views if New IP visitor
// Proceed if name + ip record does not exist in table
if (!DB::table('unique_ips')->where('name', '=', $name)->where('ip', '=', $ip)->exists()) {
// Add Name/IP Record
DB::table('unique_ips')->insert([
['name' => $name, 'ip' => $ip]
]);
// Views +1
DB::table('gallery')
->where('name', $name)
->increment('views', 1);
}
问题
此视图计数器有效,但所有唯一的 ip 记录都分组在 2 列下。它必须搜索 所有 记录才能找到匹配项,这可能会因数以千计的 ip 而变慢。
其他想法
仅使用
gallery表并添加一个unique_ips列,它将包含一个 ip 数组。但是有多少 如果字符串/文本仅限于多个字符,它还能成立吗?每个
name都可以有自己的包含ip 的列。但那样我就会有数千个列。我可以将 ip 存储在
name文本文件中,而不是在数据库中。
有更好的设计方法吗?
【问题讨论】:
-
ipv4 存在 4 个八位字节,可以转换为 1 位数字。很容易从中选择。但是,这在 ipv6 上会变得很困难。
-
IP 真的没有任何意义,你希望达到什么目的?
-
@nogad 每个 IP 增加 1 个视图。我还做了一个会话计数器,但关闭和重新打开浏览器可能会添加多个视图。
-
IP != 人,有什么意义
-
@nogad 您如何计算唯一观看次数?
标签: php mysql laravel laravel-5