Zend 2: Проверьте, кто вошел в систему с помощью сеанса
Я использую Zend\Authentication\AuthenticationService и хотел бы знать, кто вошел в систему, но сейчас я получаю данные только для одного пользователя.
Например:
В одном браузере я захожу как Джон Доу и получаю
PHPSESSID = abcdef1
Во втором браузере я захожу как Jane Bar и получаю
PHPSESSID = abcdef2
Теперь я хотел бы получить всех пользователей, которые вошли в систему, что-то вроде этого:
$storage = new \Zend\Session\Container('Zend_Auth');
foreach($storage as $data)
{
var_dump($data); // John Doe, next Jane Bar
}
Но я не могу заставить что-либо работать
$storage = new \Zend\Session\Container('Zend_Auth');
foreach($storage->getIterator() as $data)
{
var_dump($data); // I get only single data depending on which browser I use
}
или же
//$auth = AuthenticationService()
foreach($auth->getStorage()->read() as $data)
{
var_dump($data); // single data depending on which browser I use
}
или же
foreach($_SESSION['Zend_Auth'] as $session)
{
var_dump($session); // single data depending on which browser I use
}
Любая идея, как я могу получить информацию обо всех пользователях, которые вошли в систему, используя сеанс из службы аутентификации?
1 ответ
Это не работает таким образом. На каждой машине идентификатор пользователя принадлежит только его сеансу. Чтобы получить список вошедших в систему пользователей, вам необходимо отслеживать их последние действия на основе временных отметок.
Что вам действительно нужно сделать, это создать отдельную таблицу с идентификаторами пользователей и их последними действиями, только так вы будете знать, кто в сети. Затем, когда они выполняют какое-либо действие (например, просмотр сообщений), вы обновляете их активность до текущей отметки времени.
Сама таблица может выглядеть так:
user_id | last_activity
2 | 144454344
3 | 144445346
Затем, когда вы хотите получить список зарегистрированных пользователей, вы просто выбираете их идентификаторы, сравнивая с отметкой времени + несколько секунд. Затем, зная идентификаторы пользователей, чья временная метка не истекла, вы можете запросить их сущности в другой таблице.
Не рекомендуется записывать эту логику в контроллеры. Сделайте все возможное, чтобы сохранить это в объекте обслуживания.