CakePHP 在每个请求中添加新的数据库会话

问题描述 投票:0回答:1

我正在使用 Cakephp4 数据库会话。我注意到每个请求都会在

sessions
表中添加一个新行。我不希望会话超时,也不希望用户重新登录。以下是
bootstrap.php
配置和我的
app.php
配置。

Configure::write('Session', array(
    'timeout' => 518400, //1 year,
    //'autoRegenerate' => true,    
    
    'defaults' => 'database',
    'handler' => [
        'engine' => 'ComboSession',
        'model' => 'Sessions'
    ],
    'ini' => array(
        'session.cookie_samesite' => 'none',
        'session.cookie_secure' => 'true'        
    )
));

ComboSession.php

class ComboSession extends DatabaseSession
{
    protected $cacheKey;

    public function __construct()
    {

        parent::__construct();
    }

    // Read data from the session.
    public function read($id): string
    {

        Log::debug($id . '=>reading session');

        return parent::read($id);
    }

    // Write data into the session.
    public function write($id, $data): bool
    {

        Log::debug($id . '=>writing session=>' . print_r($data, true));
        parent::destroy($id);
        return parent::write($id, $data);
    }

    // Destroy a session.
    public function destroy($id): bool
    {

        Log::debug($id . '=>destroying a session');
        return parent::destroy($id);
    }

    // Removes expired sessions.
    public function gc($expires = null): bool
    {
        Log::debug($expires . '=>Calling Gc for a session');
        return parent::gc($expires);
    }
}

我没有在我的

AppController.php
中设置任何会添加新会话的内容。如果有的话,它应该更新当前会话/行而不是添加新会话/行。

php session cakephp
1个回答
0
投票

那么,我想问题不在于你的

write
类中的
ComboSession
方法。一种可能的原因可能是您的
session.cookie_secure
配置中的
Session
设置。此设置设置为
true,
意味着会话 cookie 将仅通过安全 HTTPS 连接发送。如果您的应用程序在开发期间在 HTTP 上运行,则会话 cookie 可能不会随每个请求一起发送,从而导致创建新会话。

您可以尝试在本地开发环境中将

session.cookie_secure
设置为
false
,看看是否可以解决问题。您可以在您的
.env
文件中执行此操作:

SESSION_COOKIE_SECURE=false

然后,在您的

Session
配置中,使用以下环境变量:

'ini' => array(
    'session.cookie_samesite' => 'none',
    'session.cookie_secure' => env('SESSION_COOKIE_SECURE', 'true')        
)

这样,本地开发环境中的

session.cookie_secure
设置将为
false
(假设您没有使用 HTTPS)。但是,在其他环境中它将默认为
true
,除非在
.env
文件中明确设置。

如果这不能解决问题,您可能需要进一步调试应用程序以查找原因。检查代码的任何其他部分是否可能导致在每个请求上创建新会话。

© www.soinside.com 2019 - 2024. All rights reserved.