Laravel 的会话处理程序不调用它的销毁函数
Laravel's Session Handler does not invoke it's destroy functions
我正在尝试在用户会话过期时添加其他功能。我需要在会话处理程序丢弃之前来自用户会话的数据(它在中间件之前被丢弃并且不可用)。
我在 Laravel 的原生 Illuminate\Session\FileSessionHandler.php
中添加了日志,但是 destroy()
或 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()
永远不会被触发,或者会话实际上在哪里被丢弃?
根据@apokryfos 提供的发现,Session Handler 不是为当前用户设计的,而是为其他用户设计的。
为了根据用户的会话到期执行数据库修改,可能有:
- CRON job/provider 根据记录的时间戳执行数据库修改
- 在您需要的会话数据是时触发的中间件
仍然可用(在会话处理程序删除会话之前)。
我正在尝试在用户会话过期时添加其他功能。我需要在会话处理程序丢弃之前来自用户会话的数据(它在中间件之前被丢弃并且不可用)。
我在 Laravel 的原生 Illuminate\Session\FileSessionHandler.php
中添加了日志,但是 destroy()
或 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()
永远不会被触发,或者会话实际上在哪里被丢弃?
根据@apokryfos 提供的发现,Session Handler 不是为当前用户设计的,而是为其他用户设计的。
为了根据用户的会话到期执行数据库修改,可能有:
- CRON job/provider 根据记录的时间戳执行数据库修改
- 在您需要的会话数据是时触发的中间件 仍然可用(在会话处理程序删除会话之前)。