带有Laravel和MySQL的独特IP计数器

时间:2017-03-04 05:08:20

标签: php mysql laravel laravel-5

我正在尝试为图库页面视图创建一个简单的唯一IP计数器。

我的想法是将视图记录与2个表中的图像记录分开。

数据库表

保留图片:idnamecategoryviews

gallery

unique_ips

为查看的图片ip

保留访问者name

此示例屏幕截图显示3位访客,每位观看3张图片。我使用了免费代理服务器。

unique_ips

查看计数器

如果检测到新IP:

name + ip添加到unique_ips 增加gallerynameviews +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而减慢。

其他想法

  1. 仅使用gallery表并添加 unique_ips列,它将包含一个ip的数组。但是有多少 如果字符串/文本限制为多个字符,它可以保留吗?

  2. 每个name都可以拥有自己的包含ip的列。但后来我有数千个专栏。

  3. 我可以将ip存储在name文本文件中而不是数据库中。

  4. 有没有更好的方法来设计它?

1 个答案:

答案 0 :(得分:1)

首先,使用 gallery_id 代替 name 与关系会更快。

如果你不想减慢客户端的进程,你可以创建排队的事件监听器,它将处理检查并向数据库添加记录。

查看以下关于Queued event listeners

的链接