aboulfazl950 / laravel-simple-pageviews
Requires
- foothing/laravel-repository: >=0.8.0
- illuminate/database: >=5.1
- illuminate/http: >=5.1
- jaybizzle/crawler-detect: 1.*
- nesbot/carbon: ^1.21
Requires (Dev)
- codeclimate/php-test-reporter: ^0.3.2
- mockery/mockery: ^0.9.5
- orchestra/testbench: 3.1.*
- phpunit/phpunit: 4.8.*
README
追踪Laravel 5.x应用中的页面浏览量以进行流量监控。
截至目前,它已经与Laravel 5.8和PHP 7.4进行了测试。
重要如果您是从之前的0.x版本升级,请阅读发布说明。
此软件包旨在进行简单的请求跟踪,而不是深入流量分析。功能
- 跟踪页面浏览量
- 跟踪独特的页面浏览量
- 可定制的白名单规则
- URL过滤和爬虫过滤
- 获取报告数据
每个日志记录都跟踪用户会话、用户IP和日期。
设置
安装模块
composer require aboulfazl950/laravel-simple-pageviews
在config/app.php
中添加服务提供者
'providers' => [ Foothing\Laravel\Visits\ServiceProvider::class, ]
发布迁移和配置文件
php artisan vendor:publish --provider="Footing\Laravel\Visits\ServiceProvider" --tag="config"
php artisan vendor:publish --provider="Footing\Laravel\Visits\ServiceProvider" --tag="migrations"
运行迁移
php artisan migrate
最后,在您的app/Http/Kernel.php
中添加中间件
protected $middleware = [ 'Foothing\Laravel\Visits\Middlewares\CountPageView', ];
配置
在config/visits.php
中
// Enable or disable tracking. "enabled" => true, // Add patterns to be blacklisted (ignored and not tracked). // These patterns will apply if the UrlWhitelist rule is // enabled in the chain. "blacklist" => [ // i.e. '/^(admin|api|auth).*/' ], // Rules chain. "rules" => [ "Foothing\Laravel\Visits\Rules\Crawler", "Foothing\Laravel\Visits\Rules\UrlWhitelist", ],
规则旨在过滤您不想跟踪的请求。默认规则将过滤掉爬虫(感谢https://github.com/JayBizzle/Crawler-Detect)和黑名单URL。
查询方法
$manager = app()->make("Foothing\Laravel\Visits\Reports\ReportManager"); // Get visits with url and hits. This should be used to // get an overview of the best performer urls. $manager->getVisits(); [ { "url": "foo/bar", "hits": 129 }, { "url": "baz", "hits": 40 } ] // Return int $manager->countOverallVisits(); $manager->countOverallVisits('today', 'tomorrow', 'foo/bar'); // Return int $manager->countUniqueVisits('currentWeek'); $manager->countUniqueVisits('currentWeek', null, 'foo/bar'); // Return a data collection meant for chart plotting. $manager->getVisitsTrendDaily(); [ { "day": "2016-10-08" "hits": 129 }, { "day": "2016-10-09" "hits": 40 } ]
每个查询方法都允许日期过滤,并将接受最多3个参数。
- 第一个参数可以是字符串预设,一个Carbon可以解析的字符串,或一个Carbon日期
- 第二个参数与第一个参数相同
- 第三个参数可以是URL
唯一例外是aggregate()
方法,它将接受一个limit
参数。
示例
// Triggers default filter $manager->getVisits(); // String presets $manager->getVisits('today'); $manager->getVisits('currentWeek'); $manager->getVisits('currentMonth'); $manager->getVisits('currentYear'); // Single day $manager->getVisits(\Carbon::now()); // Period $manager->getVisits(\Carbon::now(), Carbon::tomorrow());
输入缓冲区
此软件包已经在类似~20k页面浏览量/天的中等流量网站上进行了测试,这大约相当于每天17k数据库记录。访问表会很快增长,并且当对包含数十万(或数百万)行的表执行插入或更新
语句时,数据库可能会遇到性能问题。
因此,增加了一个插入/更新缓冲区。基本上,每次访问都跟踪在临时表中,该表仅在写入操作中使用,而报告和读取操作则在单独的表中执行。
已添加一个artisan
命令来处理从写入表到读取表的定期数据转储。一个好的做法可能是每天转储一次数据。
TL;DR 在您的app/Console/Kernel.php
中按以下方式配置(请参阅Laravel文档以获取有关计划的信息)
/** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ 'Foothing\Laravel\Visits\Commands\DumpVisitsBuffer', ]; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // Adjust this with your needs. $schedule->command('visits:buffer')->dailyAt("00:00"); }
性能
性能已经在约500万条记录的数据库中进行了测试,效果良好。然而,我建议在表的大小变得很大时对数据库表进行分区,例如,每个分区1百万条记录。此外,一个好的做法是根据您的流量和报告类型调整分区以与日期周期保持一致(例如,单个分区包含整个年份,单个分区包含单个季度等)。
许可证
MIT