Я использую CakePHP в своем проекте и храню сессии PHP в memcached. (CakePHP использует PHP для обработки сессий, а PHP использует memcached.) При каждом входе в систему я сохраняю IP-адрес пользователя и session_id в базе данных. Когда я использовал торт для обработки сеансов, когда пользователь пытался войти в систему, я мог получить его IP-адрес и перейти к БД, чтобы получить последний сеанс с этого IP-адреса. Имея идентификатор сеанса из последнего входа в систему, я мог бы проверить, присутствует ли файл сеанса в сеансе, и решить, может ли пользователь войти в систему.
[OBS: я знаю, что пользователи могут устанавливать прокси и обходить эту информацию, но обычно пользователи не узнают ее из-за профиля людей, которые используют приложение. Так как приложение является разновидностью игры, пользователи не могут делиться информацией. По крайней мере, мне следует этого избегать.]
При обработке входов в систему таким образом у меня возникла проблема, потому что CakePHP много раз выходил из системы пользователей, но файл сессии все еще там. [Возможно, это проблема конфигурации с истечением времени сеанса + сборщик мусора для удаления файлов.] Я отказался от решения этой проблемы, потому что мне пришлось иметь много серверов для приложения, поэтому мне пришлось перенести сессии в MySQL или memcached. Поскольку часть приложения используется в чистом PHP (без CakePHP), я решил использовать memcached, так как я могу использовать функции сеанса PHP. Если бы я выбрал MySQL, мне пришлось бы передавать идентификатор сеанса по запросам, и по соображениям безопасности я не думаю, что это хорошая идея.
Итак, мой вопрос: теперь, когда сеансы находятся в memcache, как, при попытке входа пользователя в систему, я могу проверить, есть ли еще один пользователь, вошедший в ту же сеть? Это должно быть решено, если бы я мог проверить, существует ли ключ memcache. Кто-нибудь знает, как php хранит сессии на memcache? Я обнаружил, что PHP использует ключ memc.sess.key. (из http://php.net/manual/en/memcached.sessions.php),, но мне не удалось найти этот ключ в скрипте memcache php (memcache.php Харуна Яли)
Кроме того, может ли то же самое, что происходило с файлами сеансов, происходить в memcache (сеанс с истекшим сроком действия оставил свой ключ и, вероятно, данные, зарегистрированные и швы сеансов с истекшим сроком действия все еще активными)?
С уважением.
EDIT
Найдена часть решения.
- Используя скрипт memcache.php Харуна Яли, я смог найти ключи с помощью ключей session_id
Мне удалось получить данные из сеанса по сценарию «чистый PHP», просто установив его имя с тем же именем в CakePHP и «запустив» сеанс
ini_set('session.name', 'SESSION_NAME');
session_start();
echo $_SESSION['...']
Я также могу получить данные сеанса, используя функцию getcache get (http://php.net/manual/en/memcache.get.php),, установив в качестве ключа идентификатор более старого сеанса.
Теперь я пытаюсь прочитать данные сеанса из memcache. (Данные из другого сеанса)
PHP хранит большую строку, представляющую данные сеанса, может быть сериализованным и / или сжатым и / или зашифрованным. Я мог бы использовать переменную $ _SESSION, но в данный момент я не вошел в систему с пользователем, которого хочу проверить. Как я могу узнать, что PHP + Memcache делает с моим массивом сеансов?
Здесь у вас есть часть сохраненной строки в memcache, которая представляет данные сеанса: