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

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

Не рекомендуется записывать эту логику в контроллеры. Сделайте все возможное, чтобы сохранить это в объекте обслуживания.

Другие вопросы по тегам