Yii2 CacheSession "случайно" уничтожен - PullRequest
0 голосов
/ 20 февраля 2019

Проблема

По сути, у меня есть веб-приложение Yii2, которое требует от всех пользователей входа в систему.Пользователи могут успешно войти в систему, но "случайно" выходят из системы.Это происходит 2-3 раза в день примерно для 50% моих пользователей.

Пользователи будут активны в системе, а затем загружают файл или сохраняют форму, и вместо успешного завершения действия пользователи приводятсяк экрану входа в систему, означающему, что их сеанс истек, и им необходимо снова войти в систему.

Примечания

  • В моей исходной конфигурации для сеансов использовался FileCache.В надежде решить проблему, я реализовал кэш Redis, но проблема сохраняется.
  • Существует код JavaScript, который настроен для автоматического выхода пользователей из системы после истечения срока их сеанса, но сначала выдается предупреждение, и этов этих случаях код не выполняется.

Конфигурация

Yii2 Config (оригинал)

'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 Config (обновлен) кэш")

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

PHP Config

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 голосов
/ 21 февраля 2019

После расширенного тестирования я смог последовательно воссоздать проблему, быстро обновив любую страницу в нашем приложении (с настройкой FileCache).То, что происходило, состояло в том, что сеанс все еще был там, но все значения (то есть наш идентификатор пользователя) будут очищены.Таким образом, сеанс можно было найти, но он был пустым.

Затем я обратился к нашим пользователям с новым пониманием того, что они не сталкивались с проблемой после изменения Redis.Я также не смог выполнить репликацию с бэкэндом Redis.В конечном счете, это было больше проблемой коммуникации, чем что-либо еще - извините!

Я думаю, что в конечном итоге мы стали жертвами блокировки сеансов PHP, как описано здесь: https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/

...