cyber-exploits / laravel-tracker
Laravel 访问者追踪器
Requires
- php: >=5.3.7
- cyber-exploits/laravel-support: ~1.0
- geoip/geoip: ~1.14
- jaybizzle/crawler-detect: ~1.0
- jenssegers/agent: ~2.1
- laravel/framework: ~4|~5
- ramsey/uuid: ~3
- 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
- yajra/laravel-datatables-oracle: ^8.0
This package is not auto-updated.
Last update: 2024-09-18 04:35:24 UTC
README
追踪器从您的请求中收集大量信息,以识别和存储
- 会话
- 页面浏览量(路由上的点击次数)
- 用户(已登录用户)
- 设备(电脑,智能手机,平板电脑...)
- 语言(偏好,语言范围)
- 用户设备(通过,是的,在每个设备上存储一个cookie)
- 浏览器(Chrome,Mozilla Firefox,Safari,Internet Explorer...)
- 操作系统(iOS,Mac OS,Linux,Windows...)
- 地理位置数据(纬度,经度,国家及城市)
- 路由及其所有参数
- 事件
- 来源(url,medium,source,搜索词...)
- 异常/错误
- SQL 查询及其绑定
- URL 查询及其参数
- 数据库连接
索引
为什么?
将用户跟踪信息存储在索引和归一化的数据库表中,可以节省磁盘空间,并简化从您的应用程序和业务中提取有价值信息的过程。
用法
安装并启用后,追踪器将开始存储您告诉它存储的所有信息,然后您可以在应用程序中使用追踪器外观来访问一切。以下是一些可用方法和关系
当前会话/访问者
$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');
Blade 视图
上述视图可在本包中找到,但您需要在公共文件夹中安装 sb-admin
面板,请参阅以下说明。
数据如何存储
所有表都以前缀 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 |
| 4 | Python-urllib/2.6 | Other | |
| 5 | Other | Other | |
| 6 | Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 | Chrome | 34.0.1847 |
| 7 | Mozilla/5.0 (Windows NT 6.3; rv:28.0) Gecko/20100101 Firefox/28.0 | Firefox | 28.0 |
| 8 | Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D169 Safari/9537.53 | Mobile Safari | 7.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 CyberExploits\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 CyberExploits\Tracker\Tracker::pageViewsByCountry() |
| 6 | 500 | Class CyberExploits\Firewall\Vendor\Laravel\Artisan\Base contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Illuminate\Console\Command::fire) |
| 7 | 405 | |
| 8 | 500 | Trying to get property of non-object |
| 9 | 500 | Missing argument 2 for Illuminate\Database\Eloquent\Model::setAttribute(), called in /home/forge/stage.antoniocarlosribeiro.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 2444 and defined |
+----+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
事件
+----+------------------------------------------------+
| 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 |
| 9 | creating: admin.layout |
| 10 | composing: admin.layout |
| 11 | creating: admin._partials.mainMenu |
| 12 | composing: admin._partials.mainMenu |
| 13 | creating: admin._partials.messages |
| 14 | composing: admin._partials.messages |
| 15 | creating: global._partials.google-analytics |
| 16 | composing: global._partials.google-analytics |
+----+------------------------------------------------+
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 |
| 7 | 40.1545 | -75.3809 | US | USA | United States | PA | Norristown | 19403 | 610 | 504 | 504 | NA |
| 8 | 47.4891 | -122.291 | US | USA | United States | WA | Seattle | 98168 | 206 | 819 | 819 | NA |
| 9 | 33.7516 | -84.3915 | US | USA | United States | GA | Atlanta | 30303 | 404 | 524 | 524 | NA |
| 10 | 33.7633 | -117.794 | US | USA | United States | CA | Santa Ana | 92705 | 714 | 803 | 803 | NA |
| 11 | 33.4357 | -111.917 | US | USA | United States | AZ | Tempe | 85281 | 480 | 753 | 753 | NA |
| 12 | 40.7421 | -74.0018 | US | USA | United States | NY | New York | 10011 | 212 | 501 | 501 | NA |
| 13 | 28.6185 | -81.4336 | US | USA | United States | FL | Orlando | 32810 | 407 | 534 | 534 | NA |
| 14 | 38.6312 | -90.1922 | US | USA | United States | MO | Saint Louis | 63101 | 314 | 609 | 609 | NA |
| 15 | 51 | 9 | DE | DEU | Germany | | | | | | | EU |
| 16 | 52.5 | 5.75 | NL | NLD | Netherlands | | | | | | | EU |
| 17 | 48.86 | 2.35 | FR | FRA | France | | | | | | | EU |
| 18 | 60 | 100 | RU | RUS | Russian Federation | | | | | | | EU |
| 19 | 51.5 | -0.13 | GB | GBR | United Kingdom | | | | | | | EU |
| 20 | 42.8333 | 12.8333 | IT | ITA | Italy | | | | | | | EU |
| 21 | 59.3333 | 18.05 | SE | SWE | Sweden | 26 | Stockholm | | | | | EU |
| 22 | -41 | 174 | NZ | NZL | New Zealand | | | | | | | OC |
| 23 | 37.57 | 126.98 | KR | KOR | Korea, Republic of | | | | | | | AS |
| 24 | 1.3667 | 103.8 | SG | SGP | Singapore | | | | | | | AS |
| 25 | -43.5333 | 172.633 | NZ | NZL | New Zealand | E9 | Christchurch | 8023 | | | | OC |
| 26 | -27.471 | 153.024 | AU | AUS | Australia | 04 | Brisbane | | | | | OC |
| 27 | 26.9167 | 75.8167 | IN | IND | India | 24 | Jaipur | | | | | AS |
| 28 | 32 | 53 | IR | IRN | Iran, Islamic Republic of | | | | | | | AS |
| 29 | 32.0617 | 118.778 | CN | CHN | China | 04 | Nanjing | | | | | AS |
| 30 | -22.9 | -47.0833 | BR | BRA | Brazil | 27 | Campinas | | | | | SA |
| 31 | 32.8073 | -117.132 | US | USA | United States | CA | San Diego | 92123 | 858 | 825 | 825 | NA |
| 32 | -22.9 | -43.2333 | BR | BRA | Brazil | 21 | Rio De Janeiro | | | | | SA |
+----+----------+-----------+--------------+---------------+---------------------------+--------+----------------+-------------+-----------+----------+------------+----------------+
日志
+-----+------------+---------+----------+--------+---------------+---------+-----------+---------+------------+----------+
| 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 |
| 7 | jmx-console |
| 8 | manager/html |
| 9 | administrator |
| 10 | joomla/administrator |
| 11 | cms/administrator |
| 12 | Joomla/administrator |
| 13 | phpmyadmin |
| 14 | phpMyAdmin |
| 15 | mysql |
| 16 | sql |
| 17 | myadmin |
| 18 | webdav |
+----+--------------------------------------------------------+
路由路径
+----+----------+--------------------------------------------------------+
| id | route_id | path |
+----+----------+--------------------------------------------------------+
| 1 | 1 | / |
| 2 | 2 | admin |
| 3 | 3 | login |
| 4 | 4 | login |
| 5 | 5 | admin/languages |
| 6 | 6 | admin/tracker |
| 7 | 7 | admin/pages |
+----+----------+--------------------------------------------------------+
路由
+----+--------------------------------------+----------------------------------------------------------+
| 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\Languages@index |
| 6 | admin.tracker.index | ACR\Controllers\Admin\Tracker@index |
| 7 | admin.pages.index | ACR\Controllers\Admin\Pages@index |
| 8 | admin.tracker.log | ACR\Controllers\Admin\Tracker@log |
| 9 | technology | ACR\Controllers\Technology@index |
| 10 | technology.articles.show | ACR\Controllers\Technology@show |
| 11 | language.select | ACR\Controllers\Language@select |
| 12 | admin.tracker.summary | ACR\Controllers\Admin\Tracker@summary |
| 13 | admin.tracker.api.pageviews | ACR\Controllers\Admin\Tracker@apiPageviews |
| 14 | admin.tracker.api.pageviewsbycountry | ACR\Controllers\Admin\Tracker@apiPageviewsByCountry |
| 15 | admin.pages.create | ACR\Controllers\Admin\Pages@create |
| 16 | api.markdown | ACR\Controllers\Api@markdown |
| 17 | admin.pages.store | ACR\Controllers\Admin\Pages@store |
| 18 | bio | ACR\Controllers\StaticPages@show |
| 19 | logout.do | ACR\Controllers\Logon@logout |
| 20 | admin.tracker.index | ACR\Controllers\Admin\UsageTracker@index |
| 21 | admin.tracker.api.pageviewsbycountry | ACR\Controllers\Admin\UsageTracker@apiPageviewsByCountry |
| 22 | 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 5+
- PHP 5.3.7+
- 包 "geoip/geoip":"~1.14" 或 "geoip2/geoip2":"~2.0"(如果您计划存储 Geo IP 信息)
对于 Laravel 4+,请使用版本 2.0.10。
安装
通过在命令行中执行以下命令来要求 tracker
包
composer require cyber-exploits/laravel-tracker
将服务提供者添加到您的 app/config/app.php
'CyberExploits\Tracker\Vendor\Laravel\ServiceProvider',
将别名添加到外观上 app/config/app.php
'Tracker' => 'CyberExploits\Tracker\Vendor\Laravel\Facade',
发布追踪器配置
Laravel 4
php artisan config:publish cyberexploits/tracker
Laravel 5
php artisan vendor:publish --provider=CyberExploits\\Tracker\\Vendor\\Laravel\\ServiceProvider
启用中间件(Laravel 5)
'use_middleware' => true,
将中间件添加到 Laravel Kernel(Laravel 5)
打开文件 app/Http/Kernel.php
并将以下内容添加到您的网络中间件中
\CyberExploits\Tracker\Vendor\Laravel\Middlewares\Tracker::class,
在您的 config.php(Laravel 4)或 tracker.php(Laravel 5)中启用 Tracker
'enabled' => true,
发布迁移
php artisan tracker:tables
仅在您使用 Laravel 4 时需要这样做,因为在 Laravel 5 中,vendor:publish
会为您完成
在您的 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.0"
并确保您没有安装 PHP 模块。以下是一个 Debian/Ubuntu 示例
sudo apt-get purge php5-geoip
默认情况下,所有内容都是禁用的
Tracker 有许多日志选项,但您需要决定您想要记录的内容。从启用此选项开始
'log_enabled' => true,
它负责记录页面点击和会话,基本上是客户端 IP 地址。
多个身份验证驱动程序
您只需将所有 auth IOC 绑定到数组中即可
'authentication_ioc_binding' => ['auth', 'admin'],
统计面板
要使用您的网站上的统计面板,您需要将 sb-admin 2 源代码下载到您的公共文件夹中
git clone https://github.com/BlackrockDigital/startbootstrap-sb-admin-2.git public/templates/sb-admin-2
cd public/templates/sb-admin-2
git checkout tags/v3.3.7+1
git checkout -b v3.3.7+1
并在您的配置文件中启用
'stats_panel_enabled' => true,
设置统计路由的 web 中间件(Laravel 5)
'stats_routes_middleware' => 'web',
只有管理员可以查看统计信息,所以如果您在用户模型中没有 is_admin 属性,您将需要添加一个
public function getIsAdminAttribute()
{
return true;
}
可以是 'admin'、'is_admin'、'root' 或 'is_root'。
故障排除
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,
],
],
贡献
欢迎提交拉取请求和问题。