anshu8858 / tracker
A Laravel 访问者跟踪器,基于 Antonio Carlos Ribeiro 的 Fork
Requires
- php: >=7.2
- doctrine/dbal: ^2.11
- jaybizzle/crawler-detect: ~1.2
- jenssegers/agent: ~2.6
- laravel/framework: ~7|~8
- pragmarx/support: ~0.8|~0.9
- psr/log: ~1.0
- ramsey/uuid: ^4
- snowplow/referer-parser: ~0.1
- ua-parser/uap-php: ~3.4
Requires (Dev)
- mockery/mockery: ~0.8
Suggests
- geoip/geoip: ~1.14
- geoip2/geoip2: ~2.0
- v4.0.2-alpha.2
- v4.0.2-alpha.1
- v4.0.1
- v4.0.0
- v3.5.0
- v3.4.3
- v3.4.2
- v3.4.1
- v3.4.0
- v3.3.2
- v3.3.1
- v3.3.0
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.8
- v3.1.7
- v3.1.6
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.0
- v2.0.10
- v2.0.9
- v2.0.8
- v2.0.7
- v2.0.6
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- dev-master / 1.0.x-dev
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v1.0.0-alpha.1
- v1.0.0-alpha
- v0.7.8
- v0.7.7
- v0.7.6
- v0.7.5
- v0.7.4
- v0.7.3
- v0.7.2
- v0.7.1
- v0.7.0
- v0.6.2
- v0.6.1
- v0.6.0
- v0.5.2
- v0.5.1
- v0.5.0
- v0.4.4
- v0.4.3
- v0.4.2
- v0.4.1
- v0.4.0
- v0.3.2
- v0.3.1
- v0.3.0
- v0.2.4
- v0.2.3
- v0.2.2
- v0.2.1
- v0.2.0
This package is auto-updated.
Last update: 2024-09-23 19:29:54 UTC
README
Tracker 从您的请求中收集大量信息,以识别和存储
- 会话
- 页面浏览量(路由上的点击量)
- 用户(已登录用户)
- 设备(电脑,智能手机,平板...)
- 语言(偏好,语言范围)
- 用户设备(通过,是的,在每个设备上存储一个cookie)
- 浏览器(Chrome,Mozilla Firefox,Safari,Internet Explorer...)
- 操作系统(iOS,Mac OS,Linux,Windows...)
- 地理位置数据(纬度,经度,国家城市)
- 路由及其所有参数
- 事件
- 引用者(url,medium,source,搜索词...)
- 异常/错误
- SQL 查询及其绑定
- URL 查询及其参数
- 数据库连接
索引
为什么?
在索引和归一化的数据库表上存储用户跟踪信息,可以节省更多的磁盘空间,并简化从您的应用程序和业务中提取有价值信息的过程。
用法
一旦安装并启用,Tracker 将开始存储您告诉它的所有信息,然后您可以在应用程序中使用 Tracker Facade 来访问一切。以下是可用的某些方法和关系
当前会话/访客
$visitor = Tracker::currentSession();
大多数这些方法返回 Eloquent 模型或集合,因此您不仅可以使用其属性,还可以使用关系数据
var_dump( $visitor->client_ip ); var_dump( $visitor->device->is_mobile ); var_dump( $visitor->device->platform ); var_dump( $visitor->geoIp->city ); var_dump( $visitor->language->preference );
会话(访问)
$sessions = Tracker::sessions(60 * 24); // get sessions (visits) from the past day
foreach ($sessions as $session) { var_dump( $session->user->email ); var_dump( $session->device->kind . ' - ' . $session->device->platform ); var_dump( $session->agent->browser . ' - ' . $session->agent->browser_version ); var_dump( $session->geoIp->country_name ); foreach ($session->session->log as $log) { var_dump( $log->path ); } }
在线用户
包含所有在线会话(已登录和未登录用户)
$users = Tracker::onlineUsers(); // defaults to 3 minutes
用户
$users = Tracker::users(60 * 24);
用户设备
$users = Tracker::userDevices(60 * 24, $user->id);
事件
$events = Tracker::events(60 * 24);
错误
$errors = Tracker::errors(60 * 24);
页面浏览量摘要
$pageViews = Tracker::pageViews(60 * 24 * 30);
按国家/地区页面浏览量摘要
$pageViews = Tracker::pageViewsByCountry(60 * 24);
筛选范围
您可以使用 Minutes 类将时间戳范围发送到这些方法
$range = new Minutes(); $range->setStart(Carbon::now()->subDays(2)); $range->setEnd(Carbon::now()->subDays(1)); Tracker::userDevices($range);
按名称的路由
有一个路由为
Route::get('user/{id}', ['as' => 'user.profile', 'use' => 'UsersController@profile']);
您可以使用此方法选择特定路由上的所有点击,并使用 Laravel 计数
return Tracker::logByRouteName('user.profile') ->where(function($query) { $query ->where('parameter', 'id') ->where('value', 1); }) ->count();
如果您需要计算访问该路由的唯一访客数量,您可以这样做
return Tracker::logByRouteName('tracker.stats.log') ->where(function($query) { $query ->where('parameter', 'uuid') ->where('value', '8b6faf82-00f1-4db9-88ad-32e58cfb4f9d'); }) ->select('tracker_log.session_id') ->groupBy('tracker_log.session_id') ->distinct() ->count('tracker_log.session_id');
数据如何存储
所有表都以前缀 tracker_ 开头,以下是一些表的摘录,显示列和内容
会话
+-----+--------------------------------------+---------+-----------+----------+-----------------+------------+-----------+----------+-------------+
| id | uuid | user_id | device_id | agent_id | client_ip | referer_id | cookie_id | geoip_id | language_id |
+-----+--------------------------------------+---------+-----------+----------+-----------------+------------+-----------+----------+-------------+
| 1 | 09465be3-5930-4581-8711-5161f62c4373 | 1 | 1 | 1 | 186.228.127.245 | 2 | 1 | 2 | 3 |
| 2 | 07399969-0a19-47f0-862d-43b06d7cde45 | | 2 | 2 | 66.240.192.138 | | 2 | 2 | 2 |
+-----+--------------------------------------+---------+-----------+----------+-----------------+------------+-----------+----------+-------------+
设备
+----+----------+-------------+-------------+------------------+-----------+
| id | kind | model | platform | platform_version | is_mobile |
+----+----------+-------------+-------------+------------------+-----------+
| 1 | Computer | unavailable | Windows 8 | | |
| 2 | Tablet | iPad | iOS | 7.1.1 | 1 |
| 3 | Computer | unavailable | Windows XP | | |
| 5 | Computer | unavailable | Other | | |
| 6 | Computer | unavailable | Windows 7 | | |
| 7 | Computer | unavailable | Windows 8.1 | | |
| 8 | Phone | iPhone | iOS | 7.1 | 1 |
+----+----------+-------------+-------------+------------------+-----------+
代理
+----+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------+-----------------+
| id | name | browser | browser_version |
+----+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------+-----------------+
| 1 | Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 | Chrome | 35.0.1916 |
| 2 | Mozilla/5.0 (iPad; CPU OS 7_1_1 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53 | Chrome Mobile iOS | 34.0.1847 |
| 3 | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) | IE | 6.0 |
+----+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------+-----------------+
语言
+----+------------+----------------+
| id | preference | language_range |
+----+------------+----------------+
| 1 | en | ru=0.8,es=0.5 |
| 2 | es | en=0.7,ru=0.3 |
| 3 | ru | en=0.5,es=0.5 |
+----+------------+----------------+
域名
+----+--------------------------+
| id | name |
+----+--------------------------+
| 1 | antoniocarlosribeiro.com |
+----+--------------------------+
错误
+----+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | code | message |
+----+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | 404 | |
| 2 | 500 | Call to undefined method PragmaRX\Tracker\Tracker::sessionLog() |
| 3 | 500 | Trying to get property of non-object (View: /home/forge/stage.antoniocarlosribeiro.com/app/views/admin/tracker/log.blade.php) |
| 4 | 500 | syntax error, unexpected 'foreach' (T_FOREACH) |
| 5 | 500 | Call to undefined method PragmaRX\Tracker\Tracker::pageViewsByCountry() |
| 6 | 500 | Class PragmaRX\Firewall\Vendor\Laravel\Artisan\Base contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Illuminate\Console\Command::fire) |
+----+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
事件
+----+------------------------------------------------+
| id | name |
+----+------------------------------------------------+
| 1 | illuminate.log |
| 2 | router.before |
| 3 | router.matched |
| 4 | auth.attempt |
| 5 | auth.login |
| 6 | composing: admin.tracker.index |
| 7 | creating: admin.tracker._partials.menu |
| 8 | composing: admin.tracker._partials.menu |
+----+------------------------------------------------+
geoip
+----+----------+-----------+--------------+---------------+---------------------------+--------+----------------+-------------+-----------+----------+------------+----------------+
| id | latitude | longitude | country_code | country_code3 | country_name | region | city | postal_code | area_code | dma_code | metro_code | continent_code |
+----+----------+-----------+--------------+---------------+---------------------------+--------+----------------+-------------+-----------+----------+------------+----------------+
| 1 | 37.4192 | -122.057 | US | USA | United States | CA | Mountain View | 94043 | 650 | 807 | 807 | NA |
| 2 | -10 | -55 | BR | BRA | Brazil | | | | | | | SA |
| 3 | 30.3909 | -86.3161 | US | USA | United States | FL | Miramar Beach | 32550 | 850 | 686 | 686 | NA |
| 4 | 38.65 | -90.5334 | US | USA | United States | MO | Chesterfield | 63017 | 314 | 609 | 609 | NA |
| 5 | 42.7257 | -84.636 | US | USA | United States | MI | Lansing | 48917 | 517 | 551 | 551 | NA |
| 6 | 42.8884 | -78.8761 | US | USA | United States | NY | Buffalo | 14202 | 716 | 514 | 514 | NA |
+----+----------+-----------+--------------+---------------+---------------------------+--------+----------------+-------------+-----------+----------+------------+----------------+
日志
+-----+------------+---------+----------+--------+---------------+---------+-----------+---------+------------+----------+
| id | session_id | path_id | query_id | method | route_path_id | is_ajax | is_secure | is_json | wants_json | error_id |
+-----+------------+---------+----------+--------+---------------+---------+-----------+---------+------------+----------+
| 1 | 1 | 1 | | GET | 1 | | 1 | | | |
| 2 | 1 | 2 | | GET | 2 | | 1 | | | |
| 3 | 1 | 3 | | GET | 3 | | 1 | | | |
| 4 | 1 | 3 | | POST | 4 | | 1 | | | |
+-----+------------+---------+----------+--------+---------------+---------+-----------+---------+------------+----------+
路径
+----+--------------------------------------------------------+
| id | path |
+----+--------------------------------------------------------+
| 1 | / |
| 2 | admin |
| 3 | login |
| 4 | admin/languages |
| 5 | admin/tracker |
| 6 | admin/pages |
+----+--------------------------------------------------------+
路由路径
+----+----------+--------------------------------------------------------+
| id | route_id | path |
+----+----------+--------------------------------------------------------+
| 1 | 1 | / |
| 2 | 2 | admin |
| 3 | 3 | login |
| 4 | 4 | login |
+----+----------+--------------------------------------------------------+
路由
+----+--------------------------------------+----------------------------------------------------------+
| id | name | action |
+----+--------------------------------------+----------------------------------------------------------+
| 1 | home | ACR\Controllers\Home@index |
| 2 | admin | ACR\Controllers\Admin\Admin@index |
| 3 | login.form | ACR\Controllers\Logon@form |
| 4 | login.do | ACR\Controllers\Logon@login |
| 5 | admin.languages.index | ACR\Controllers\Admin\Pages@store |
| 6 | bio | ACR\Controllers\StaticPages@show |
| 7 | logout.do | ACR\Controllers\Logon@logout |
| 8 | admin.tracker.index | ACR\Controllers\Admin\UsageTracker@index |
| 9 | admin.tracker.api.pageviewsbycountry | ACR\Controllers\Admin\UsageTracker@apiPageviewsByCountry |
| 10 | admin.tracker.api.pageviews | ACR\Controllers\Admin\UsageTracker@apiPageviews |
+----+--------------------------------------+----------------------------------------------------------+
SQL 查询
+----+------------------------------------------+-------------------------------------------------------------------------------------------------+-------+---------------+
| id | sha1 | statement | time | connection_id |
+----+------------------------------------------+-------------------------------------------------------------------------------------------------+-------+---------------+
| 1 | 5aee121018ac16dbf26dbbe0cf35fd44a29a5d7e | select * from "users" where "id" = ? limit 1 | 3.13 | 1 |
| 2 | 0fc3f3a722b0f9ef38e6bee44fc3fde9fb1fd1d9 | select "created_at" from "articles" where "published_at" is not null order by "created_at" desc | 1.99 | 1 |
+----+------------------------------------------+-------------------------------------------------------------------------------------------------+-------+---------------+
手动记录事项
如果您的应用程序有特殊需求,您可以手动记录类似的事项
事件
Tracker::trackEvent(['event' => 'cart.add']); Tracker::trackEvent(['event' => 'cart.add', 'object' => 'App\Cart\Events\Add']);
路由
Tracker::trackVisit( [ 'name' => 'my.dynamic.route.name', 'action' => 'MyDynamic@url' ], ['path' => 'my/dynamic/url'] );
要求
- Laravel 7+, 8+
- PHP 7.2+
- 包 "geoip/geoip":"~1.14" 或 "geoip2/geoip2":"~2.1"(如果您计划存储 Geo IP 信息)
安装
通过在命令行中执行以下命令来安装 tracker 包
composer require anshu8858/tracker
将服务提供商添加到您的 app/config/app.php
PragmaRX\Tracker\Vendor\Laravel\ServiceProvider::class,
将别名添加到 facade 的 app/config/app.php
'Tracker' => 'PragmaRX\Tracker\Vendor\Laravel\Facade',
发布 tracker 配置
php artisan vendor:publish --provider="PragmaRX\Tracker\Vendor\Laravel\ServiceProvider"
启用中间件(Laravel 7)
打开位于 app/config/tracker.php 的新发布配置文件,并启用 use_middleware
'use_middleware' => true,
将中间件添加到 Laravel Kernel(Laravel 7)
打开文件 app/Http/Kernel.php 并将以下内容添加到您的 web 中间件中
\PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,
在您的 tracker.php 中启用 Tracker(Laravel 7)
'enabled' => true,
发布迁移
php artisan tracker:tables
通常您需要这个
php artisan migrate --database=tracker --path=/database/migrations/tracker/
vendor:publish 在 Laravel 7 中为您完成。
在您的 config/database.php 中为它创建数据库连接
'connections' => [ 'mysql' => [ ... ], 'tracker' => [ 'driver' => '...', 'host' => '...', 'database' => ..., 'strict' => false, // to avoid problems on some MySQL installs ... ], ],
迁移它
如果您已将默认连接设置为 tracker,则可以
php artisan migrate
否则,您必须
php artisan migrate --database=tracker
如果您计划存储 Geo IP 信息,也请安装 geoip 包
composer require "geoip/geoip":"~1.14"
or
composer require "geoip2/geoip2":"~2.1"
并确保您没有安装 PHP 模块。以下是一个 Debian/Ubuntu 示例
sudo apt-get purge php5-geoip
默认情况下,所有内容均被禁用
Tracker 有很多日志选项,但您需要决定您要记录什么。从启用这个开始
'log_enabled' => true,
它负责记录页面点击和会话,基本上是客户端 IP 地址。
多个认证驱动程序
您只需将您的 auth IOC 绑定到数组中
'authentication_ioc_binding' => ['auth', 'admin'],
故障排除
是否已启用所有内容?
确保 Tracker 在配置文件中已启用。通常这是大多数问题的来源。
跟踪您的 laravel.log 文件
tail -f storage/logs/laravel.log
通常无法跟踪的 IP 地址和其他消息将出现在日志中
[2018-03-19 21:28:08] local.WARNING: TRACKER (unable to track item): 127.0.0.1 is not trackable.
SQLSTATE[42000]:语法错误或访问违规:1067 对于 '字段名称' 的无效默认值
这可能与 MySQL 上的 SQL 模式有关,特别是与 NO_ZERO_IN_DATE 和 NO_ZERO_DATE 模式有关
https://stackoverflow.com/questions/36882149/error-1067-42000-invalid-default-value-for-created-at
Laravel 默认为
set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
您可能需要更改 Tracker 数据库连接配置为
'connections' => [ ... 'tracker' => [ ... 'strict' => false, ], ],
无法跟踪用户?
如果您收到类似错误
Base table or view not found: 1146 Table 'tracker.users' doesn't exist
您可能需要更改
'user_model' => 'PragmaRX\Tracker\Vendor\Laravel\Models\User',
以创建(或使用当前)一个用户模型
'user_model' => 'App\TrackerUser',
并配置与您的用户表相关的连接
protected $connection = 'mysql';
无法跟踪 API?
在您的内核中
protected $middlewareGroups = [
'web' => [
.......
\PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,
],
'api' => [
.......
\PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,
],
];
作者
许可证
Tracker 根据 BSD 3-Clause 许可证授权 - 有关详细信息,请参阅 LICENSE 文件
贡献
欢迎提交拉取请求和问题。