首页 > 解决方案 > Laravel 的 Session Handler 不会调用它的销毁函数

问题描述

我正在尝试在用户会话到期时添加其他功能。在会话处理程序丢弃它之前,我需要来自用户会话的数据(它在中间件之前被丢弃并且不可用)。

我在 Laravel 的 native 中添加了日志Illuminate\Session\FileSessionHandler.php,但是在会话到期时不会触发destroy()or函数。gc()

FileSessionHandler只有添加的日志:

namespace Illuminate\Session;
...
class FileSessionHandler implements SessionHandlerInterface
{ 
  ...

  public function __construct(Filesystem $files, $path, $minutes)
  {
    Log::debug('within FileSessionHandler __construct()');
    ...
  }

  public function open($savePath, $sessionName) {
    Log::debug('within FileSessionHandler open()');
    ...
  }

  public function close() {
    Log::debug('within FileSessionHandler close()');
    ...
  }

  public function read($sessionId) {
    Log::debug('within FileSessionHandler read()');
    ...
  }

  public function write($sessionId, $data) {
    Log::debug('within FileSessionHandler write()');
    ...
  }

  public function destroy($sessionId) {
    Log::debug('within FileSessionHandler destroy()');
    ...
  }

  public function gc($lifetime) {
    Log::debug('within FileSessionHandler gc()');
    ...
  }
}

laravel.log会话到期后刷新:

[2021-03-23 20:51:30] stage.DEBUG: within FileSessionHandler read()  
[2021-03-23 20:51:30] stage.DEBUG: within FileSessionHandler write()  
[2021-03-23 20:51:36] stage.DEBUG: within FileSessionHandler construct()  
[2021-03-23 20:51:36] stage.DEBUG: within FileSessionHandler read()  
[2021-03-23 20:51:36] stage.DEBUG: within FileSessionHandler write()  
[2021-03-23 20:51:36] stage.DEBUG: within FileSessionHandler construct()  
[2021-03-23 20:51:36] stage.DEBUG: within FileSessionHandler read()  
[2021-03-23 20:51:37] stage.DEBUG: within FileSessionHandler write()  
[2021-03-23 20:51:37] stage.DEBUG: within FileSessionHandler construct()  
[2021-03-23 20:51:37] stage.DEBUG: within FileSessionHandler read()  
[2021-03-23 20:51:38] stage.DEBUG: within FileSessionHandler write()  
[2021-03-23 20:52:54] stage.DEBUG: within FileSessionHandler construct()  
[2021-03-23 20:52:54] stage.DEBUG: within FileSessionHandler read()  
[2021-03-23 20:52:54] stage.DEBUG: within FileSessionHandler write()  
[2021-03-23 20:52:54] stage.DEBUG: within FileSessionHandler construct()  
[2021-03-23 20:52:54] stage.DEBUG: within FileSessionHandler read()  
[2021-03-23 20:52:54] stage.DEBUG: within FileSessionHandler write()  

config\session.php

'driver' => 'file',
...
'lifetime' => env('SESSION_LIFETIME', 120),

有谁知道为什么destroy()并且gc()从未被解雇,或者会话实际上被丢弃在哪里?

标签: phplaravelsession

解决方案


从@apokryfos 提供的发现来看,Session Handler 不是为当前用户设计的,而是为清理其他用户而设计的。

为了根据用户的会话到期执行数据库修改,可能有:

  • 一个 CRON 作业/提供程序,用于根据记录的时间戳执行数据库修改
  • 在您需要的会话数据仍然可用时触发的中间件(在会话处理程序删除会话之前)。

推荐阅读