2012-05-15 45 views
1

我程序聊天室,但无法找到显示在线和离线用户的方式。 我使用会话进行在线用户。当用户登录页面而不是空的会话更新数据库和联机1。 现在怎么知道用户从聊天或关闭浏览器注销。我知道whith会话时间或捕获可以做到这一点,但我不能写适合的代码。任何人都可以帮助我,并在这里完整的代码 感谢答案显示聊天室边栏中的在线用户

作秀在线:

session_start(); 
include("config.php"); 
connect(); 
$sql="SELECT `username` FROM `user` WHERE `online`=1"; 
$result=mysql_query($sql) or die (mysql_error()); 
if(mysql_num_rows($result)>0) 
{ 
for ($i=0;$i<mysql_num_rows($result);$i++) 
{ 
echo ('<b style="color:green;margin-left:10px;margin-top:10px;">'.mysql_result($result,$i,0).'</b><br>'); 
if($_SESSION['user']!="" 
} 
+0

哪些是您使用实时通信技术? Websockets或ajax longpolling或不同的东西? – Christoph

+0

我用阿贾克斯寻找在线用户和聊天 –

回答

0

你可以把简单的“如果”操作,以检查是否有会话时间比实时最短。

示例。

在数据库中使用户列中的last_activity。当用户发送消息进行查询以更新该列时,使用time()最后一个活动;

只要检查数据库中的last_activity是否超过timeout,在这种情况下,您可以设置$ timeout变量用于超时。 这里是代码:

<?php # make while loop from users where online = 1 
$last_activity_from_database = $row['last_activity']; 
$timeout      = time()-600; # 10 minutes 
if($last_activity_from_database < $timeout){ 
    mysql_query("UPDATE users SET online='0'"); 
} 
?> 

您应该进行AJAX调用。

+0

谢谢,但我怎么可以更新最后的活动? –

+0

当用户发送消息或创建js函数,检查的每分钟,最后一次活动.. – harisdev

+0

也许用户只能看到聊天室,不发送消息。我如何为这种情况创建js函数? –

1

您可以使用php脚本按计划运行,当用户不在现场时,更新状态将会更新为脱机状态。

为此,有时候应该通过ajax将用户状态发送到服务器,并将其存储在数据库中。

更新..

JS,用于发送状态jQuery函数到PHP每500ms。

function upd_status() { 
    $.get('/php.php', function(data) { 
     setTimeout(upd_status,500); 
    }); 
} 
upd_status(); 

在php方面。

// I do not know where is user id, but it should be in session 
$uid = $_SESSION['user']['uid']; 
settype($uid, 'int'); 

$sql = "UPDATE user SET status = 1, timestamp = ". time() ." WHERE id = ". $uid ."; 

上的cron脚本

$sql = "UPDATE user SET status = 0 WHERE timestamp < ". (time()-60*5); 
+0

谢谢你能为我举个例子吗? –

+0

即使通过mysql_query()没有额外的检查,它也能工作,但我建议在cron脚本上使用PDO – ShaaD

+0

?而1000个在线用户的聊天室500毫秒可以压力服务器? –