【问题标题】:Yii2: Perform action on session timeoutYii2:对会话超时执行操作
【发布时间】:2020-04-18 23:56:16
【问题描述】:

我使用Yii2 sessions 为来宾用户存储会话数据。

在会话期间,@runtime 目录中会生成文件。这些文件以数据库 ID 命名(例如 234.pdf)。

当用户选择某些东西时,选择保存在数据库中,存储在会话中并生成一个文件:

$model->save();
file_put_contents($model->id.".pdf", ...);
Yii::$app->session->set("model_id",$model->id);

当会话到期时,应删除与会话相关的文件。出于统计原因,必须保留数据库内容。

会话到期时如何获得识别?

【问题讨论】:

  • 如果您知道上次登录的时间,例如,您可以使用 cron 作业 1d 后删除文件
  • 我只是有根本不登录的访客用户。所以附加到登录过程不是有效的选择
  • 好吧,决定什么时候可以安全地删除文件。例如。每个午夜或创建文件的一周后...
  • 我想说你必须主要使用session.cookie_lifetimesession.gc_maxlifetime并实现你的会话超时,并且要在Yii中做到这一点你必须首先知道如何在核心php中做到这一点, here 是一本很好的读物,可以帮助您首先了解为什么需要实现自己的会话超时,然后如何做到这一点,这是一个有点宽泛的问题,所以我认为您应该实现,然后如果您卡在某个地方,我们可以调查一下。
  • @MuhammadOmerAslam 我现在明白 Yii2 不支持可以在此处使用的“sesson timeout”等事件。我将不得不不时编写 cronjobs 来清理文件。

标签: php session yii2


【解决方案1】:

Yii 没有可配置的会话事件处理程序,在您的情况下,我将创建自己的特定会话处理程序来扩展 PHP 的内置 SessionHandler

namespace app\components;

class CustomSessionHandler extends \SessionHandler
{
    public function destroy($sessionId)
    {
        // here you could implement your custom requirements
        return parent::destroy($sessionId);
    }
}

这是你的配置

'components' => [
    'session' => [
        'handler' => \app\components\CustomSessionHandler::class
    ],
    ...
];

【讨论】:

  • 方法destroy()什么时候准确执行?您能否为您的解决方案提供更多见解?我不想手动调用它。它应该绑定到 Session 上下文
  • 销毁与会话超时或到期无关,这个答案更有可能是手动注销,如果我没有错的话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2018-08-20
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
相关资源
最近更新 更多