Laravel Session是在每个请求上创建/生成的,Redis占用了大量的RAM空间

5t7ly7z5  于 2024-01-06  发布在  Redis
关注(0)|答案(1)|浏览(134)

所以我有一个Laravel 10项目,它使用Sanctum的SPA认证,它将会话存储到Redis,并遇到了服务器上RAM突然100%使用的问题。
当我查看Chrome的devtools的Network选项卡时,我看到每次请求后会话值都会发生变化。
我不会在任何地方调用session()->regenerate(),也不会以任何方式操纵会话。
在这种情况下,我尝试在本地修复应用程序的storage文件夹内的文件/目录权限。这是一个好主意,因为我在Devtools中看到会话值不再更改,它保持不变。
好吧,我想确定一下,所以我使用redis-cli查看了Redis。我执行了FLUSHDB,向laravel应用程序发出了一些请求,然后执行了

  1. KEYS *

字符串
这最终注销了很多条目-每个请求。
我在app\Http\Kernel.php中的中间件变量看起来像这样:

  1. protected $middleware = [
  2. StartSession::class,
  3. TrustProxies::class,
  4. PreventRequestsDuringMaintenance::class,
  5. ValidatePostSize::class,
  6. TrimStrings::class,
  7. ConvertEmptyStringsToNull::class,
  8. ];

TLDR;即使Devtools显示相同的会话cookie值,Laravel也会在每个请求中生成新的会话。

30byixjq

30byixjq1#

我认为这可能是因为跨源XHR请求。在它们正常执行之前,我们会等待,在每一个之前都有preflight(OPTIONS)请求发生。
这个请求基本上不能包含cookie,因为我们没有包含session值,Laravel的StartSession中间件,它在每个请求上执行,生成新的session值并将其保存到Redis。
这是生成所有未知会话的地方。所以我从$middleware变量中删除了StartSession中间件并创建了一个新的:

  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Http\Middleware;
  4. use Closure;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Session\Middleware\StartSession;
  7. use Symfony\Component\HttpFoundation\Response;
  8. class StartSessionExtended
  9. {
  10. /**
  11. * Handle an incoming request.
  12. *
  13. * @param Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
  14. */
  15. public function handle(Request $request, Closure $next): Response
  16. {
  17. if ($request->isMethod('OPTIONS')) {
  18. return $next($request);
  19. }
  20. return app(StartSession::class)->handle($request, $next);
  21. }
  22. }

字符串
这样做的目的是当请求的类型是OPTIONS时,它跳过执行StartSession中间件。

展开查看全部

相关问题