我正在使用 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
中设置任何会添加新会话的内容。如果有的话,它应该更新当前会话/行而不是添加新会话/行。
那么,我想问题不在于你的
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
文件中明确设置。
如果这不能解决问题,您可能需要进一步调试应用程序以查找原因。检查代码的任何其他部分是否可能导致在每个请求上创建新会话。