rovereto/metrika

Laravel Metrika 是一个轻量级且详细的跟踪和记录用户访问的包,适用于您的 Laravel 应用程序。每个请求只需一个简单的查询,就可以存储重要数据,并在以后通过 cronjob 对数字进行压缩,从而从大量数据中提取有意义的见解。

v1.9.0 2024-10-01 13:05 UTC

This package is auto-updated.

Last update: 2024-10-01 13:07:33 UTC


README

这是对已被放弃的 Rinvex Statistics 的重新编写版本。也受到了 Laravel Stats Tracker 的启发。

主要区别

  • 不使用 requests 表,而是使用一组 hitsvisitsvisitors,就像在 Yandex Metrica 中的 基本概念:页面浏览量、会话、用户 一样
  • 引用者被单独放入自己的表中
  • 可以将统计信息保存到另一个数据库
  • 移除了 Rinvex 依赖项

Packagist License Packagist Downloads

描述 Rinvex Statistics

Rinvex Statistics 是一个轻量级且详细的包,用于跟踪和记录您 Laravel 应用程序中的用户访问。每个请求只需一个简单的查询,就可以存储重要数据,并在以后通过 cronjob 对数字进行压缩,从而从大量数据中提取有意义的见解。

与其他会严重影响项目性能的跟踪包(是的,我指的是您知道的那个包 😅)不同,我们的包通过在每个请求结束后,在向用户响应之后,通过自动附加中间件的 terminate 方法执行单个查询,然后使用先前插入数据库的原始数据提取有意义的数字。这是基于随机抽奖请求或通过计划任务(推荐)完成的,该任务可以排队以卸载繁重的压缩工作。

Rinvex Statistics 跟踪每个 -有效的- 请求,这意味着只有通过路由管道传递的请求,这也意味着任何导致 NotFoundHttpException 的错误 URL 都不会被跟踪。如果请求的页面有未捕获的异常,它也不会被跟踪。它跟踪用户登录的账户(如果有)、所有用户和访客的会话(如果有)、设备(家族、型号、品牌)、平台(家族、版本)、浏览器(代理、类型、家族、版本)、路径、路由(操作、中间件、参数)、主机、协议、IP 地址、语言、状态代码等,并且我们还计划在未来添加更多出色的功能。

由于收集了如此大量的数据,statistics_requests 数据库表的大小将明显增加,尤其是如果您有很多访问量。因此,建议定期清理它。其他重要数据将保持在其相应的表中,规范化且没有任何性能问题,因此只需要清理此表。默认情况下,这将每月自动执行。

Rinvex Statistics 的默认实现无需配置即可直接使用,这意味着安装后即可使用。但建议更改默认设置并从配置文件中禁用“统计压缩彩票”,并将其替换为 计划任务 以获得更好的性能,如果您有大量的访问量。有关详细信息,请参阅 用法

安装

  1. 通过 composer 安装此包

    composer require rovereto/metrika
  2. 发布资源(迁移和配置文件)

    php artisan vendor:publish --provider="Rovereto\Metrika\Providers\MetrikaServiceProvider"
  3. 如果您需要将统计信息保存到另一个数据库,请编辑 config/metrika.php

    'connection' => 'metrika',

    并为它在你的 config/database.php 中创建一个数据库连接

    'connections' => [
        'mysql' => [
            ...
        ],
        
        'metrika' => [
            'driver'   => '...',
            'host'     => '...',
            'database' => ...,
            'strict' => false,    // to avoid problems on some MySQL installs
            ...
        ],
    ],
  4. 通过以下命令执行迁移

    php artisan migrate
  5. 完成!

用法

Laravel MetrikaRinvex Statistics 没有使用说明,因为它直接就可用!你安装它,就完成了!真的!!

无论如何,作为一个推荐的性能优化,你可以进行以下操作(可选)

  1. 通过以下命令发布配置文件

    php artisan vendor:publish --provider="Rovereto\Metrika\Providers\MetrikaServiceProvider"
    
  2. 从配置文件中禁用“统计数据处理彩票”

  3. 按照默认的 Laravel 文档关于 计划任务 进行操作,然后根据适当的间隔计划 \Rovereto\Metrika\Jobs\CrunchStatistics\Rovereto\Metrika\Jobs\CleanStatisticsRequests 任务。

  4. 享受吧!

注意: Laravel Metrika 有一个 \Rovereto\Metrika\Http\Middleware\TrackStatistics 中间件,它会自动附加到 web 中间件组,这就是它无需配置即可直接使用的原理。

数据检索

你可能需要构建自己的前端界面来浏览统计数据,为此,你可以使用包含的任何 eloquent 模型,就像你通常使用 Laravel Eloquent 一样。

所有 eloquent 模型都是自解释的

  • \Rovereto\Metrika\Models\Agent 浏览器代理模型
  • \Rovereto\Metrika\Models\Datum 原始统计数据(待处理)
  • \Rovereto\Metrika\Models\Device 用户设备模型
  • \Rovereto\Metrika\Models\Domain 引用设备模型
  • \Rovereto\Metrika\Models\Geoip 地理 IP 模型
  • \Rovereto\Metrika\Models\Hit 用户点击模型
  • \Rovereto\Metrika\Models\Path 请求路径模型
  • \Rovereto\Metrika\Models\Platform 用户平台模型
  • \Rovereto\Metrika\Models\Referer 请求引用详情模型
  • \Rovereto\Metrika\Models\Route 请求路由详情模型
  • \Rovereto\Metrika\Models\Visit 访问模型
  • \Rovereto\Metrika\Models\Visitor 访客模型

所有模型都绑定到 服务容器,因此你可以轻松地在应用程序的任何地方交换它们。除了默认的显式使用这些模型的方式之外,你还可以使用它们的相应服务名称,如下例所示

// Find first browser agent (any of these methods are valid and equivalent)
app('metrika.agent')->first();
new \Rovereto\Metrika\Models\Agent::first();
app(\Rovereto\Metrika\Models\Agent::class)->first();

所有其他 eloquent 模型也是如此。

识别地理位置

为了通过 IP 地址确定地理位置,使用 GeoIP for Laravel (Torann\GeoIP) 包。

要自定义包,发布配置文件

php artisan vendor:publish --provider="Torann\GeoIP\GeoIPServiceProvider" --tag=config

配置文件将发布到 config/geoip.php

使用 MaxMindDatabase 的示例

...
'service' => 'maxmind_database',
...
'services' => [
...
     'maxmind_database' => [
         'class' => \Torann\GeoIP\Services\MaxMindDatabase::class,
         'database_path' => database_path('geoip/GeoLite2-City.mmdb'),
         'update_url' => sprintf('https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=%s&suffix=tar.gz', env('MAXMIND_LICENSE_KEY')),
         'locales' => ['en'],
     ],
...

Torann\GeoIP 包不支持 IP2Location,但他们已经实现了对此基础的支持。

使用 IP2Location 的示例

...
'service' => 'ip2location_database',
...
'services' => [
...
     'ip2location_database' => [
         'class' => \Rovereto\Metrika\Services\Ip2Location::class,
         'database_path' => database_path('ip2location/IP2LOCATION.BIN'),
     ],
...

识别代理

为了通过 IP 地址确定代理,使用 IP2Proxy PHP 模块 包。

默认情况下禁用代理检测。在配置文件 config/metrika.php 中启用它们,同时写出 bin 数据库的文件名。

确定代理的示例

...
'use_proxy' => true,
...
'proxy_path' => database_path('ip2location/IP2PROXY.BIN'),
...

使用 cookie 文件

Metrika 可能会使用匿名标识符来跟踪访客,这些标识符存储在 cookie 中。默认情况下禁用 cookie。在配置文件 config/metrika.php 中启用它们,同时给 cookie 起一个名字。示例

...
'store_cookie' => true,
...
'cookie_name' => 'my_name_cookie_for_metrika',
...

并在文件 .env 中设置 cookie 的顶级域名

SESSION_DOMAIN=".my-domain.com"

或文件 config/session.php

...
'domain' => env('SESSION_DOMAIN', '.my-domain.com'),
...

如果你使用多个子域名,为了识别相同用户,在文件 app/Http/Middleware/EncryptCookies.php 中禁用 Metrika 的 cookie 加密

...
protected $except = [
...
    'my_name_cookie_for_metrika'
...  
];
...

注意: 每个 Laravel 应用程序都使用其自己的密钥来加密 cookie。因此,一个调用者的 cookie 将以不同的方式加密。

数据使用

Laravel Metrika 的两个类连接选项

use Rovereto\Metrika\Support\Facades\Metrika;

use Metrika;

所选期间最受欢迎的页面,计数 - $limit

use Rovereto\Metrika\Support\Facades\Metrika;

Metrika::getTopPageViewsForPeriod(DateTime $startDate, DateTime $endDate, int $limit = 10, bool $with_robots = false);
//example Most viewed pages for period 01.01.2020 - 31.12.2020 limit 100 pages without robots
Metrika::getTopPageViewsForPeriod(Carbon::parse('01.01.2020'), Carbon::parse('31.12.2020'), 100);

图表数量:按日统计点击次数、访问次数和独立访客数量

返回用于绘制折线图的数组

use Rovereto\Metrika\Support\Facades\Metrika;

Metrika::getHitsForPeriodLine(DateTime $startDate, DateTime $endDate, string $group = 'day', bool $with_robots = false);
//example Hits for period 01.01.2020 - 31.12.2020 by month without robots
Metrika::getHitsForPeriodLine(Carbon::parse('01.01.2020'), Carbon::parse('31.12.2020'), 'month');

构建饼图的常用方法

按周期显示饼图来源
Metrika::getSourcesForPeriodPie(DateTime $startDate, DateTime $endDate, bool $with_robots = false);
按周期显示饼图搜索系统
Metrika::getSearchEngineForPeriodPie(DateTime $startDate, DateTime $endDate, bool $with_robots = false);
按周期显示饼图浏览器
Metrika::getBrowsersForPeriodPie(DateTime $startDate, DateTime $endDate, bool $with_robots = false);
按周期显示饼图操作系统
Metrika::getOsForPeriodPie(DateTime $startDate, DateTime $endDate, bool $with_robots = false);
按周期显示饼图设备
Metrika::getDevicesForPeriodPie(DateTime $startDate, DateTime $endDate, bool $with_robots = false);
按周期显示饼图国家和地区
Metrika::getCountryForPeriodPie(DateTime $startDate, DateTime $endDate, bool $with_robots = false);

使用示例在 examples 目录中

重要的计数

所有代理、设备、路径、平台、路由模型都有一个 count 属性,每当有新的请求被跟踪时,该属性会自动更新。

count 属性反映点击次数。为了使问题更清晰,让我们通过数据样本进行说明

代理

这意味着有 734 次访问我们的项目是通过 Chrome 浏览器,版本 63.0.3239,代理为(**Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36**)

设备

这意味着有 83 次访问我们的项目是通过 iPhone 设备。

平台

这意味着有 615 次访问我们的项目是通过 Mac OS X 操作系统,版本 10.12.6

路径

这意味着有 12 次访问 test.homestead.local 主机的管理员仪表板角色管理(如果你在同一项目中启用了多个主机或通配符子域名,你可以在此处正确跟踪它们)。使用英文界面,一个用于区域设置(在这种情况下为英文),并更新了角色记录(在这种情况下为管理员)。

此表格可以用作所有页面的访问计数器。例如,要检索和显示页面浏览量,你可以使用以下代码

$pageViews = app('metrika.path')->where('path', request()->decodedPath())->first()->count;

然后简单地在你的视图或控制器中任何地方使用 $pageViews 变量,或者在其他任何地方。这样,你就可以在你的项目所有页面上自动计数访问量,非常实用且性能优越,随时可用。如果你启用了通配符子域名,可以添加 host 约束。

查询

请求参数作为 json

路由

这意味着有 41 次访问 adminarea.roles.edit 路由,该路由的原始路径为 {locale}/adminarea/roles/{role},通过 App\Http\Controllers\Adminarea\RolesController@form 控制器操作提供,并应用以下中间件 ["web","nohttpcache","can:access-adminarea","auth","can:update-roles,roles"],了解路由接受以下正则表达式要求的两个参数 {"role": "[a-z0-9-]+", "locale": "[a-z]{2}"}

如你所见,此 statistics_routes 表与 statistics_paths 表相辅相成,可以一起使用来跟踪哪些路径和路由被访问,访问了多少次,以及哪些控制器操作提供它,以及需要哪些参数,以及实际用于访问的参数替换。将路由视为你的原始链接蓝图图,将路径视为用户实际使用的链接。

引用者

这意味着有 57 次访问我们的项目来自社交网站facebook.com。

Medium 字段选项

  • search - 来自搜索引擎
  • social - 来自社交网络
  • unknown - 引用者未知
  • internal - 内部引用者
  • email - 从电子邮件切换
  • invalid - 引用者检测错误

域名

这意味着有 24 次访问我们的项目来自 google.com。

Geoips

这意味着有 57 次访问来自 IP 地址 127.0.0.0 的项目,纬度、经度和时区如上所述来自 New Haven 城市和 Connecticut 州。

访客

独立访客。通过 session_iduser_iduser_type,您可以跟踪访客(未登录)和用户(已登录)。

访问

独立访问。通过 session_iduser_iduser_type,您可以跟踪访客(未登录)和用户(已登录)。

点击

这是最全面的表格,记录了对项目提出的每个请求,包括如上所示的访问详细信息。

备注

  • 最后一点需要注意的是,这个包是一个数据仓库,它并没有实际执行很多可以利用这些宝贵数据集完成的数学运算,因此如何利用它取决于您的想象力,以适应您的目标。实现细节由您自己决定。
  • 我们没有解释data表,因为它用于临时存储原始数据,直到它被包处理和压缩,所以您不应该关注或干预该表。该表由包内部使用,没有真正的终端用户使用。
  • \Rovereto\Metrika\Models\Hit模型与所有相关数据有关,如visitorvisitagentdeviceplatformpathrouterefererdomaingeoip。因此,一旦获取到击中实例,您就可以像通常使用Eloquent Relationships一样访问其关系:例如$hit->visitor->agent->version$hit->visitor->platform->family$hit->visit->geoip->city

贡献

请阅读CONTRIBUTING.md以了解我们的行为准则以及向提交给我们提交拉取请求的过程。

版本控制

我们使用语义版本控制进行版本控制。有关可用版本,请参阅此存储库的标签

变更日志

有关项目的完整历史,请参阅变更日志

支持

以下支持渠道随时可供您使用

作者

还可以查看参与此项目的贡献者列表

许可

本项目采用MIT许可(MIT)——麻省理工学院许可——有关详细信息,请参阅LICENSE.md文件。