我在Laravel大项目和Redis存储方面遇到问题。我们将会话存储在Redis中。我们已经有28GB的RAM。但是,它仍然可以相对快地运行到极限,因为我们有很多来自搜索引擎机器人的点击(每天超过25万次)。
有什么优雅的方法可以完全禁用机器人的会话?我已经实现了自己的会话中间件,如下所示:
<?php namespace App\Http\Middleware; use App\Custom\System\Visitor; class StartSession extends \Illuminate\Session\Middleware\StartSession { protected function getSessionLifetimeInSeconds() { if(Visitor::isBot()) { return 1; } return ($this->manager->getSessionConfig()['lifetime'] ?? null) * 60; } protected function sessionIsPersistent(array $config = null) { if(Visitor::isBot()) { return false; } $config = $config ?: $this->manager->getSessionConfig(); return ! in_array($config['driver'], [null, 'array']); } }
这是我检测机器人的功能:
public static function isBot() { $exceptUserAgents = [ 'Googlebot', 'Bingbot', 'Yahoo! Slurp', 'DuckDuckBot', 'Baiduspider', 'YandexBot', 'Sogou', 'facebot', 'ia_archiver', ]; if(!request()->header('User-Agent') || !str_contains(request()->header('User-Agent'), $exceptUserAgents)) { return false; } return true; }
不幸的是,这似乎不起作用。有人在这里有小费或经验吗?非常感谢你!
这就是我为自己解决的方法。
composer require jaybizzle/crawler-detect
命名空间App \ Http \ Middleware; ClassNoSessionForBotsMiddleware { 公共功能句柄($ request,\ Closure $ next) { 如果((新\ Jaybizzle \ CrawlerDetect \ CrawlerDetect)-> isCrawler()){ \ Config :: set('session.driver','array'); } 返回$ next($ request); } }
Kernel
受保护的$ middlewareGroups = [ 'web'=> [ // .. NoSessionForBotsMiddleware :: class, StartSession :: class, // .. ], // .. ];