rovereto / metrika
Laravel Metrika 是一个轻量级且详细的跟踪和记录用户访问的包,适用于您的 Laravel 应用程序。每个请求只需一个简单的查询,就可以存储重要数据,并在以后通过 cronjob 对数字进行压缩,从而从大量数据中提取有意义的见解。
Requires
- php: ^8.0.0
- doctrine/dbal: ^2.5 || ^3.0
- geoip2/geoip2: ^2.0.0
- illuminate/bus: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- illuminate/console: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- illuminate/contracts: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- illuminate/database: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- illuminate/http: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- illuminate/queue: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- illuminate/routing: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- illuminate/support: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- ip2location/ip2location-php: ^9.0.0
- ip2location/ip2proxy-php: ^4.0.0
- jaybizzle/crawler-detect: ~1.0
- jenssegers/agent: ^2.6.0
- rovereto/country: ^1.0
- snowplow/referer-parser: ~0.1
- symfony/http-foundation: ^6.0|^7.0
- torann/geoip: ^3.0.0
- ua-parser/uap-php: ^3.9.0
Requires (Dev)
- codedungeon/phpunit-result-printer: ^0.31.0
- illuminate/container: ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0
- phpunit/phpunit: ^9.5.0
README
这是对已被放弃的 Rinvex Statistics 的重新编写版本。也受到了 Laravel Stats Tracker 的启发。
主要区别
- 不使用
requests表,而是使用一组hits、visits和visitors,就像在 Yandex Metrica 中的 基本概念:页面浏览量、会话、用户 一样 - 引用者被单独放入自己的表中
- 可以将统计信息保存到另一个数据库
- 移除了 Rinvex 依赖项
描述 Rinvex Statistics
Rinvex Statistics 是一个轻量级且详细的包,用于跟踪和记录您 Laravel 应用程序中的用户访问。每个请求只需一个简单的查询,就可以存储重要数据,并在以后通过 cronjob 对数字进行压缩,从而从大量数据中提取有意义的见解。
与其他会严重影响项目性能的跟踪包(是的,我指的是您知道的那个包 😅)不同,我们的包通过在每个请求结束后,在向用户响应之后,通过自动附加中间件的
terminate方法执行单个查询,然后使用先前插入数据库的原始数据提取有意义的数字。这是基于随机抽奖请求或通过计划任务(推荐)完成的,该任务可以排队以卸载繁重的压缩工作。Rinvex Statistics 跟踪每个 -有效的- 请求,这意味着只有通过路由管道传递的请求,这也意味着任何导致
NotFoundHttpException的错误 URL 都不会被跟踪。如果请求的页面有未捕获的异常,它也不会被跟踪。它跟踪用户登录的账户(如果有)、所有用户和访客的会话(如果有)、设备(家族、型号、品牌)、平台(家族、版本)、浏览器(代理、类型、家族、版本)、路径、路由(操作、中间件、参数)、主机、协议、IP 地址、语言、状态代码等,并且我们还计划在未来添加更多出色的功能。由于收集了如此大量的数据,
statistics_requests数据库表的大小将明显增加,尤其是如果您有很多访问量。因此,建议定期清理它。其他重要数据将保持在其相应的表中,规范化且没有任何性能问题,因此只需要清理此表。默认情况下,这将每月自动执行。Rinvex Statistics 的默认实现无需配置即可直接使用,这意味着安装后即可使用。但建议更改默认设置并从配置文件中禁用“统计压缩彩票”,并将其替换为 计划任务 以获得更好的性能,如果您有大量的访问量。有关详细信息,请参阅 用法。
安装
-
通过 composer 安装此包
composer require rovereto/metrika
-
发布资源(迁移和配置文件)
php artisan vendor:publish --provider="Rovereto\Metrika\Providers\MetrikaServiceProvider" -
如果您需要将统计信息保存到另一个数据库,请编辑
config/metrika.php'connection' => 'metrika',
并为它在你的
config/database.php中创建一个数据库连接'connections' => [ 'mysql' => [ ... ], 'metrika' => [ 'driver' => '...', 'host' => '...', 'database' => ..., 'strict' => false, // to avoid problems on some MySQL installs ... ], ],
-
通过以下命令执行迁移
php artisan migrate
-
完成!
用法
Laravel Metrika 如 Rinvex Statistics 没有使用说明,因为它直接就可用!你安装它,就完成了!真的!!
无论如何,作为一个推荐的性能优化,你可以进行以下操作(可选)
-
通过以下命令发布配置文件
php artisan vendor:publish --provider="Rovereto\Metrika\Providers\MetrikaServiceProvider" -
从配置文件中禁用“统计数据处理彩票”
-
按照默认的 Laravel 文档关于 计划任务 进行操作,然后根据适当的间隔计划
\Rovereto\Metrika\Jobs\CrunchStatistics和\Rovereto\Metrika\Jobs\CleanStatisticsRequests任务。 -
享受吧!
注意: 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_id、user_id 和 user_type,您可以跟踪访客(未登录)和用户(已登录)。
访问
独立访问。通过 session_id、user_id 和 user_type,您可以跟踪访客(未登录)和用户(已登录)。
点击
这是最全面的表格,记录了对项目提出的每个请求,包括如上所示的访问详细信息。
备注
- 最后一点需要注意的是,这个包是一个数据仓库,它并没有实际执行很多可以利用这些宝贵数据集完成的数学运算,因此如何利用它取决于您的想象力,以适应您的目标。实现细节由您自己决定。
- 我们没有解释
data表,因为它用于临时存储原始数据,直到它被包处理和压缩,所以您不应该关注或干预该表。该表由包内部使用,没有真正的终端用户使用。\Rovereto\Metrika\Models\Hit模型与所有相关数据有关,如visitor、visit、agent、device、platform、path、route、referer、domain和geoip。因此,一旦获取到击中实例,您就可以像通常使用Eloquent Relationships一样访问其关系:例如$hit->visitor->agent->version、$hit->visitor->platform->family或$hit->visit->geoip->city。
贡献
请阅读CONTRIBUTING.md以了解我们的行为准则以及向提交给我们提交拉取请求的过程。
版本控制
我们使用语义版本控制进行版本控制。有关可用版本,请参阅此存储库的标签。
变更日志
有关项目的完整历史,请参阅变更日志。
支持
以下支持渠道随时可供您使用
作者
- Alexander Ilyutkin Ilyutkin
还可以查看参与此项目的贡献者列表。
许可
本项目采用MIT许可(MIT)——麻省理工学院许可——有关详细信息,请参阅LICENSE.md文件。