在线用户登录

时间:2010-01-06 19:51:07

标签: php

我想构建一个用于检测在线用户ip的代码(PHP)

我已经安装了Discuz forum。它显示了ips本身。

我想要的是不同的东西。

我想构建一个代码,在一个页面中查看所有在线用户的IP。

我怎么能这样做?

我写了一段代码。见:

function getRealIpAddr() 
{
  if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
  {
    $ip=$_SERVER['HTTP_CLIENT_IP'];
  }
  elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
  {
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
  }
  else
 {
   $ip=$_SERVER['REMOTE_ADDR'];
 }

 return $ip;
}

用法:

$ipp=getRealIpAddr();
echo "real ip=".$ipp;

但是我希望在一个页面中看到整个在线用户的IP,就像日志一样。

这次我试着说清楚。

3 个答案:

答案 0 :(得分:1)

我无法回答您如何使用您正在使用的论坛软件实现此功能。我已经检查了网站,他们有mods和插件的论坛,所以你可能想问那里是否必须是一个插件(除非有人知道它当然)。

要查找当前登录到您网站的所有用户的IP,您可以执行以下操作(我们定义当前登录为“有会话”):

// put in your bootstrap after you defined getRealIpAddr()
if(session_id() === '') {
    session_start();
}
$_SESSION['ip'] = getRealIpAddr();

然后在你的lib中添加一个SessionReader类,例如

class SessionReader
{
    // serializes session data without destroying your own session 
    public function decode($filecontent){
        // see http://de.php.net/manual/de/function.session-decode.php#69111
    }

    // just reads in the contents of a session file
    public function readSessionData($file)
    {
        return file_get_contents(realpath("$session_save_path/$file"));
    }

    // returns all filenames in save path starting with 'sess'
    public function getSessionFiles()
    {
        $path = realpath(session_save_path());
        return glob($path . '/sess*');
    }

    // uses the above methods to build an array of all decoded sessions
    public function getEveryonesSessionData()
    {
        $contents = array_filter($this->getSessionFiles(), 
                                 array($this, "readSessionData"));

        return array_filter($contents, array($this, "decode")); 
    }
}

要使用它,请执行

$sessionReader = new SessionReader;
foreach( $sessionReader->getEveryonesSessionData() as $session) {
    echo $session['IP'];
}

免责声明:这只是一个概念验证,即丑陋的黑客攻击。我不希望这个没有调整就可以工作。所以你也不应该。但你应该可以从这里完成它。

SessionReader应该能够读入PHP.ini或应用程序中其他位置指定的session_save_path中的所有会话文件。假设是,会话文件以 sess 开头并存储在文件系统中。当调用getEveryonesSessionData()时,该类将查找,读取,解码并返回数组中的所有会话文件,因此您可以逐个访问它们。

要使用论坛软件运行,您必须了解他们如何定义当前登录的用户以及他们是否以及如何使用会话。

答案 1 :(得分:0)

如果您不想像Ishmael建议的那样只检查您的服务器日志,那么您可以自己进行数据库记录。你不能让PHP知道目前在线的每个人。 “当前在线”无论如何都不是一个真实的概念(除非你在讨论执行页面的微小时间框架。)它通常意味着“在最后X分钟内”。像论坛软件这样的东西只记录上次访问时间,并向用户显示最后访问时间在过去X分钟内的人数。所以你可以做同样的事情但也记录IP。

答案 2 :(得分:0)

This正是您要找的......