我正在尝试为图库页面视图创建一个简单的唯一IP计数器。
我的想法是将视图记录与2个表中的图像记录分开。
保留图片:id
,name
,category
,views
列
为查看的图片ip
name
此示例屏幕截图显示3位访客,每位观看3张图片。我使用了免费代理服务器。
如果检测到新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
文本文件中而不是数据库中。
有没有更好的方法来设计它?
答案 0 :(得分:1)
首先,使用 gallery_id 代替 name 与关系会更快。
如果你不想减慢客户端的进程,你可以创建排队的事件监听器,它将处理检查并向数据库添加记录。
查看以下关于Queued event listeners
的链接