问题
实际上,我有一个yii2 web应用程序,它要求所有用户登录。用户可以成功登录,但“随机”从系统中注销。对于我的50%用户来说,这种情况每天发生2-3次。
用户将在系统上处于活动状态,然后上载文件或保存表单,用户将被带到登录屏幕,这意味着他们的会话已过期,需要重新登录,而不是成功完成操作。
笔记
我的原始配置将文件缓存用于会话。为了解决这个问题,我实现了一个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

我真的很努力,所以任何指导、问题或建议都会非常感谢。即使只是一些关于在哪里添加日志记录的建议也会有帮助。

最佳答案

在扩展测试之后,我能够通过快速刷新应用程序中的任何页面(使用filecache设置)来持续地重新创建问题。正在发生的是会话仍然存在,但所有值(即用户ID)都将被清除。因此可以找到会话,但它是空的。
然后我又联系了我们的用户,他们有了一个新的认识,那就是自从redis改变以来,他们没有经历过这个问题。我也无法用redis后端进行复制。归根结底,这是一个沟通问题比任何其他-对不起!
我认为我们最终是这里描述的php会话锁定的受害者:https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/

07-27 18:36