【问题标题】:How to count the unique visitors via Laravel and display them in a chart?如何通过 Laravel 统计唯一访问者并将其显示在图表中?
【发布时间】:2015-07-18 09:29:30
【问题描述】:

我想通过 Laravel 概述我的唯一访问者(有点像 cloudflare)。

我已经拥有的:

我有一个数据库方案,但我认为这不是很好:

我想将尽可能多的数据存储到我的数据库中,而不是存储位置、浏览器等...

我希望能够每天查看所有访问者(唯一的,所以一天内不是两次相同的 IP),所以计算 IP 地址,以及整个月的时间。

例如:

4 月份需要像这样显示在我的视图中:

['1/04', 5],
['2/04', 58],
['3/04', 496],
['4/04', 654],
['5/04', 854],
['6/04', 756],
['7/04', 254],
['8/04', 887],
['9/04', 452],
['10/04', 985],
['11/04', 745],
['12/04', 120],
['13/04', 985],
['14/04', 745],
['15/04', 321],
['16/04', 852],
['17/04', 753],
['18/04', 951],
['19/04', 791],
['20/04', 167],
['21/04', 761],
['22/04', 349],
['23/04', 741],
['24/04', 258],
['25/04', 963],
['26/04', 317],
['27/04', 482],
['28/04', 341],
['29/04', 654],
['30/04', 751]

因此,每天都必须计算 IP 的数量,并且在一个月内,这将取决于当前月份。

输出看起来与此类似:

如果可能的话,我想收到一个控制器、视图和数据库方案。 我已经搜索了整个互联网,但没有找到任何东西...... 如果有人可以帮助我,我会非常高兴!

最诚挚的问候,

罗宾

【问题讨论】:

    标签: php mysql laravel laravel-4


    【解决方案1】:

    这种架构的主要问题是MySql不擅长聚合。您需要的是时间序列内的聚合数据。为此,您可以使用Cassandra 时间序列或MongoDb 方法。

    当在 db 中插入新的唯一 ip 时,会执行以下嵌套插入:

    1. 本年度的点击次数增加
    2. 当月点击次数增加
    3. 本周点击次数增加
    4. 当天的点击次数增加
    5. 当前小时的点击次数增加
    6. 当前分钟的点击次数增加。

    例如,当在 2015-06-14 23:11:23 在 MongoDb 策略中记录新命中时:

    {
    _id : MongoId(),
    year : 2015,
    hits : ++,
    months : {
        6 : {
            hits : ++,
            days : {
                14 : {
                    hits : ++,
                    hours : {
                        23 : {
                            hits : ++,
                            minutes : {
                                11 : {
                                    hits : ++
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    }
    

    使用此策略,您可以查询具有良好时间复杂度的分钟限制的日期范围。

    如果您只需要最近的数据(例如仅上个月),您也可以使用Redis。然后您将increment 站点点击current_monthday_14_of_current_monthhour_23_of_current_dayminute_23_of_current_hour 作为您的聚合键。 Redis 检索具有 O(1) 复杂性的单个键,以及具有 O(n) 的多个键(例如当月的第 0 天到第 5 天)。

    我使用Redis 方法为用 Laravel 5 编写的类似bit.ly 的网站提供统计信息,在每次请求后发布带有请求 ip 数据的 rabbitmq 消息,多个工作人员同时弹出作业,并插入聚合数据导入redis,因此统计数据接近实时。

    【讨论】:

    • 我对 mongodb、cassandra 或 redis 不熟悉,您能否解释一下我如何集成所有内容或我的数据库必须是什么样的?我很快就需要这个解决方案,因为没有这个选项我不能把我的应用程序放到网上。已经感谢您的惊人努力!
    【解决方案2】:

    如果我正确理解您的目标,这就是我解决问题的方法。

    对您的数据库进行以下更改:

    1) Remove the hits field.
    
    2) Store dates in a YYYY-MM-DD format. 
    

    然后检查数据库中的现有记录或在新用户登录或请求页面时创建新记录(您可能应该在数据库中缓存此减少命中):

    $visitor = Visit::firstOrCreate(['date'=>$current_date,'ip'=>$ip_address);
    

    然后,当您需要为您的视图检索数据时,您可以调用:

    $visits = Visit::selectRaw('date count(date) as hits'))->groupBy('date')->whereRaw("`date` between $begin and $end")->get();
    

    这应该可以让你继续前进,但你必须自己制定观点等。

    【讨论】:

    • 这对我帮助很大!但现在的主要问题是,我无法从数据库中选择它们。我的查询看起来像这样:prntscr.com/72xz8f 和原始看起来像这样:prntscr.com/72xzew 但作为输出,我什么也得不到。没有一个结果。我在 navicat 中执行了查询,这就是我所拥有的:prntscr.com/72xzrc 是的,我的数据库中确实有这两个日期之间的记录。
    • 经过一番研究,我找到了解决方案。我得到的输出是这样的:laravel.io/bin/BLyM3 现在的问题是我的 javascript 代码不采用这样的值。 {} 必须替换为 [] 并且第一个 [] 需要消失。
    • 在将其返回给 JavaScript 之前,您是否调用了 $visits->toJson()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2015-11-17
    • 2012-09-16
    相关资源
    最近更新 更多