使用jqueryheartbeat(或PHP)统计在线用户数

使用jqueryheartbeat(或PHP)统计在线用户数,php,jquery,heartbeat,Php,Jquery,Heartbeat,我目前正在使用此php代码计算当前在线的用户数: $session_id = session_id(); $time_stamp = time(); $time_limit = $time_stamp - 300; // We give the session only 5 minutes if it exists $result = $this->select("SELECT * FROM `online_visitors` WHERE `session_id`='$s

我目前正在使用此php代码计算当前在线的用户数:

$session_id = session_id();
$time_stamp = time();
$time_limit = $time_stamp - 300;        //   We give the session only 5 minutes if it exists
$result = $this->select("SELECT * FROM `online_visitors` WHERE `session_id`='$session_id' LIMIT 1");
if (!mysql_num_rows($result)) {
    $tb_col[0] = "visitor_ip";
    $tb_col[1] = "country";
    $tb_col[2] = "session_id";
    $tb_col[3] = "time_stamp";
    $tb_col[4] = "last_time_stamp";
    $tb_data[0] = "'" . $this->visitor_ip . "'";
    $tb_data[1] = "'" . $this->visitor_country . "'";
    $tb_data[2] = "'" . $session_id . "'";
    $tb_data[3] = "'" . $time_stamp . "'";
    $tb_data[4] = "'" . $time_stamp . "'";
    $this->insert("`online_visitors`", $tb_col, $tb_data);
} else {
    $this->update("`online_visitors`", "`visitor_ip`='$this->visitor_ip', `country`='$this->visitor_country', `last_time_stamp`='$time_stamp'", "`session_id`='$session_id'");
}

$this->delete("`online_visitors`", "`last_time_stamp`<'$time_limit'");
$session\u id=session\u id();
$time_stamp=time();
$time\u limit=$time\u stamp-300;//如果会话存在,我们只给它5分钟
$result=$this->select(“从`online\u visitors`中选择*,其中`session\u id`='$session\u id'限制1”);
如果(!mysql_num_rows($result)){
$tb_col[0]=“访客ip”;
$tb_col[1]=“国家”;
$tb_col[2]=“会话id”;
$tb_col[3]=“时间戳”;
$tb_col[4]=“上次时间戳”;
$tb_数据[0]=“此->访问者_ip。”;
$tb_数据[1]=“'””$this->visitor_country。“”;
$tb_数据[2]=“'.”$session_id.“”;
$tb_数据[3]=“时间戳”。”;
$tb_数据[4]=“时间戳”。”;
$this->insert(“`online\u visitors`,$tb\u col,$tb\u data”);
}否则{
$this->update(“`online\u visitors`'”、“`visitor\u ip`='$this->visitor\u ip'、`country`='$this->visitor\u country'、`last\u time\u stamp`='$time\u stamp'、`session\u id`='$session\u id');
}

$this->delete(“`online\u visitors`)”,“`last\u time\u stamp`您也可以通过另一种方式执行此操作:不通过ajax更新时间,而是假设用户在线,直到他离开页面或关闭浏览器。在这种情况下,您可以使用ajax将用户设置为脱机,并在卸载之前启动浏览器时执行。在极少数情况下(停电、系统崩溃)此事件不会触发,因此最好同时检查上次更新的时间,以防您有一个浮动用户。

您最好的选择是php等效的asp应用程序对象,假设有一个。为许多用户不断地进行这样的查询可能会非常繁重,需要大量资源。是的,我知道,但我该怎么做才能让它变得更好?很抱歉,我在这方面帮不了你-我上次使用PHP已经有几年了。如果是经典的ASP或.net,那么我可能可以提供帮助。由于您提到的罕见情况,这根本不是一个好方法。将用户标记为在线(在数据库或应用程序对象中)是最好的方法,将获得最准确的结果。假设会话超时设置为10分钟,设置页面加载上最后一次看到的时间,然后通过ajax使用
setTimeout(fn,30000);
(如果我错了,请纠正我,这应该是5分钟,以毫秒为单位)@ClarkeyBoy这种罕见的情况可以通过crontab清理来处理。虽然每5分钟重置一次在线状态的方法并不是服务器所要求的,所以我认为它应该也能工作。你也可以使用XMPP来实现这一点……在php中用户登录保存会话和计算会话时很简单