我正在使用Zend \ Authentication \ AuthenticationService,我想知道谁被记录,但是现在我只为一个用户获取数据。
例如:
在一个浏览器上,我以 John Doe 身份登录,然后我
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
}
任何想法如何使用来自身份验证服务的会话获取有关所有用户的信息?
答案 0 :(得分:1)
这种方式不起作用。在每台机器上,用户的id仅属于他们的会话。要获取已登录用户的列表,您需要根据时间戳跟踪他们的最新活动。
您真正需要做的是创建一个包含用户ID及其上一个活动的分隔表,只有这样您才能知道谁在线。然后,当他们执行某些操作(如查看消息)时,您将其活动更新为当前时间戳。
表格本身可能如下所示:
user_id | last_activity
2 | 144454344
3 | 144445346
然后,当您想要获取当前登录用户的列表时,您只需选择他们的ID与时间戳+几秒钟相比较。然后知道时间戳未过期的用户ID,您可以在另一个表中查询其实体。
作为最佳实践,不要在控制器中编写该逻辑。尽力将其保留在服务对象中。