【问题标题】:Unique IP Counter with Laravel and MySQLLaravel 和 MySQL 的唯一 IP 计数器
【发布时间】:2017-07-24 08:36:28
【问题描述】:

我正在尝试为画廊页面浏览量创建一个简单的唯一 IP 计数器。

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

数据库表

画廊

持有图片:idnamecategoryviews

unique_ips

持有访客ip 以查看图片name

此示例屏幕截图显示 3 位访问者每人查看 3 张图片。我使用了免费的代理 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 文本文件中,而不是在数据库中。

有更好的设计方法吗?

【问题讨论】:

  • ipv4 存在 4 个八位字节,可以转换为 1 位数字。很容易从中选择。但是,这在 ipv6 上会变得很困难。
  • IP 真的没有任何意义,你希望达到什么目的?
  • @nogad 每个 IP 增加 1 个视图。我还做了一个会话计数器,但关闭和重新打开浏览器可能会添加多个视图。
  • IP != 人,有什么意义
  • @nogad 您如何计算唯一观看次数?

标签: php mysql laravel laravel-5


【解决方案1】:

起初使用 gallery_id 而不是 name 与关系会更快。

如果您不想在客户端减慢进程,您可以制作排队事件侦听器,它将处理检查并将记录添加到数据库。

查看以下关于Queued event listeners的链接

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多