会议席卷彩票

时间:2016-02-17 12:59:58

标签: php laravel session

有人可以解释会议席卷抽奖的内容吗?我已经附加了Laravel框架的默认会话配置文件。

问题:1。它说某些会话驱动程序必须手动扫描它们     存储位置。有人可以描述这个过程及其原因     必要?哪些会话驱动程序需要此操作?     2.为什么需要彩票?如果说某种形式的存储(数据库)     已满,为什么它必须是随机的?为什么不能构建框架     当检测到驱动程序已满时扫描旧会话?

/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/

'lottery' => array(2, 100),

2 个答案:

答案 0 :(得分:5)

因此,会话是存储在服务器上一段时间的一段数据。

想象一下,使用带文件的文件夹来存储会话。必须有一个旧会议应该被清除的时刻。由于无法每隔x小时自动检查文件,因此会在某些请求中检查会话文件。
此设置是此检查发生的可能性。在这种情况下,每个请求中有2个为100个。

我认为目前唯一需要的会话驱动程序是数据库驱动程序。

如果您在存储空间已满时扫描存储空间,则新会话有可能无法启动,直到存储空间被清空。
如果你在每次请求时扫描存储,你的所有请求都会变得很慢。

答案 1 :(得分:0)

我完全同意 Jerodev 的回答。

对于现在正在寻找此功能的任何人,从 Laravel 8 开始,以下是以下方法:

\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php:

/**
 * Remove the garbage from the session if necessary.
 *
 * @param  \Illuminate\Contracts\Session\Session  $session
 * @return void
 */
protected function collectGarbage(Session $session)
{
    $config = $this->manager->getSessionConfig();

    // Here we will see if this request hits the garbage collection lottery by hitting
    // the odds needed to perform garbage collection on any given request. If we do
    // hit it, we'll call this handler to let it delete all the expired sessions.
    if ($this->configHitsLottery($config)) {
        $session->getHandler()->gc($this->getSessionLifetimeInSeconds());
    }
}

/**
 * Determine if the configuration odds hit the lottery.
 *
 * @param  array  $config
 * @return bool
 */
protected function configHitsLottery(array $config)
{
    return random_int(1, $config['lottery'][1]) <= $config['lottery'][0];
}

config/session.php 中的默认值为 [2, 100]。

因此 configHitsLottery() 会计算 1 到 100 之间的 random integer 并将其与 2 进行比较,如下所示:

return random_int(1, 100) <= 2;