如何通过Laravel统计独特的访客并将其显示在图表中?

时间:2015-05-07 16:55:00

标签: php mysql laravel laravel-4

我想通过Laravel概述我的独特访客(有点像cloudflare)。

我已经拥有的东西:

我有一个数据库,但我不认为这是好的: db sheme

我想尽可能多地将数据存储到我的数据库中,但不是存储地点,浏览器等......

我希望能够每天查看所有访问者(唯一的,一天内不是两次相同的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]

因此,每天必须计算知识产权的数量,而且一个月内,这将取决于当月。

输出看起来与此类似:

Output

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

最诚挚的问候,

罗宾

2 个答案:

答案 0 :(得分:5)

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

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

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();

这应该可以帮到你,但你必须自己解决这些问题。

答案 1 :(得分:2)

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

在执行嵌套插入后,在db中插入新的唯一ip:

  1. 当年的点击次数增加
  2. 当月的点击次数增加
  3. 本周的点击次数增加
  4. 当天的点击次数增加
  5. 当前小时的点击次数增加
  6. 当前分钟的点击次数增加。
  7. 例如,在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中编写的documentation网站提供统计信息,每次请求发布带有请求IP数据的Rabbitmq消息,多个工作程序同时弹出作业,并将聚合数据插入redis,因此统计数据几乎是实时的。