anshu8858/tracker

A Laravel 访问者跟踪器,基于 Antonio Carlos Ribeiro 的 Fork


README

Latest Stable Version License Downloads

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_DATENO_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,
    ],
];

作者

Antonio Carlos Ribeiro 所有贡献者

许可证

Tracker 根据 BSD 3-Clause 许可证授权 - 有关详细信息,请参阅 LICENSE 文件

贡献

欢迎提交拉取请求和问题。