Yii2 CacheSession“随机”销毁

时间:2019-02-19 21:06:56

标签: php session redis yii2

问题

本质上,我有一个Yii2 Web应用程序,要求所有用户登录。用户能够成功登录,但是被“随机地”从系统中注销。每天大约有50%的用户发生这种情况2-3次。

用户将在系统上处于活动状态,然后上载文件或保存表单,而不是成功完成操作,而是将用户带到登录屏幕,这意味着他们的会话已过期,需要再次登录。

注释

  • 我的原始配置使用FileCache进行会话。为了解决该问题,我实现了Redis缓存,但是问题仍然存在。
  • 有设置为在用户会话期满后自动注销用户的javascript代码,但会首先发出警告,并且在这些情况下该代码不会执行。

配置

Yii2配置(原始)

'session' => ['class' => 'yii\web\CacheSession'],
'cache' => ['class' => 'yii\caching\FileCache'],
'user' => [
            'class' => 'app\models\YiiUser',
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => false,
            'enableSession' => true,
            'authTimeout' => 1200, // 20 min (in seconds)
        ],

Yii2配置(更新的“缓存”)

'cache' => [
        'class' => 'yii\redis\Cache',  
        'redis' => [
            'hostname' => 'localhost',
            'port' => 6379,
            'database' => 0,
        ]
    ],

PHP配置

session.save_handler = files
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440

我真的很努力,所以任何指导,问题或建议都将不胜感激。即使只是一些建议,也可以在哪里添加一些日志记录。

1 个答案:

答案 0 :(得分:1)

经过扩展测试,我能够通过快速刷新应用程序中的任何页面(使用FileCache设置)来始终如一地重现该问题。发生的事情是会话仍然存在,但是所有值(即我们的用户ID)都将被清除。因此可以找到会话,但会话为空。

然后,我与我们的用户取得了新的联系,他们了解自Redis更改以来他们从未遇到过此问题。我也无法使用Redis后端进行复制。最终,这更多的是沟通问题,对不起!

我认为我们最终是PHP会话锁定的受害者,如下所述:https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/