PHP重新加载聊天框



我用PHP做了一个类似聊天框的东西。唯一的问题是它不会自动重新加载。有没有一种方法可以让它在PHP中重新加载,或者我必须移动所有东西才能使用AJAX?另外,我的一个用户经常在线。我已经设置为,如果他们在过去3分钟内按下了某个键或单击,则他们处于脱机状态,并在他们离开页面时将其设置为脱机状态。他们使用的是Firefox 9.0。这是因为onunload的使用吗?解决方案是什么?

您可以使用meta refresh标记,该标记可以由PHP生成,但它并不是PHP特有的特性。

<meta http-equiv="refresh" content="600">

这将在600秒后刷新内容。您可以根据应用程序的需求更准确地控制时间。

Ajax可能是检查用户不活动的首选方法。这里有一篇关于检查用户活动的类似文章——如果用户当前在页面上处于活动状态,我如何使用JavaScript/jQuery检测?

更新

至于如何在Firefox中处理用户退出的第二个问题,就像您所说的onunload可能不一致。这就是ajax的使用再次大放异彩的地方。如果你的应用程序停止接收来自客户端的ajax更新,你可以进行某种清理,将它们标记为非活动。

我们在ASP.Net MVC应用程序中也遇到过类似的情况。我们最终使用应用程序变量来存储用户最近的活动和状态。php示例可以在这里找到。

希望这能有所帮助!

您可以添加一些JavaScript来自动刷新整个页面,但使用AJAX对最终用户来说会更好。

Facebook的做法是,客户端"Alice"有一个等待新消息的请求,打开时间约为1分钟。如果另一个客户端"Bob"给Alice写了一条消息,则服务器可以完成Alice的挂起请求。然后Alice立即获得新消息并打开一个新的挂起的请求。

大约一分钟后,你将不得不暂停挂起的请求,或者浏览器会这样做。不同的浏览器有不同的超时设置,所以只需使用一些小的设置。超时后,您将打开一个新的挂起请求,以避免遗漏任何内容。

我有一些代码可以玩:listen.php(客户端调用它来创建挂起的请求,等待事件$eid.的消息nr$mnr

define('WAIT_MAX', 55); // wait max 55 sec
define('WAIT_INT', 1);  // wait 1 sec per call
$start = time();
while ($start + WAIT_MAX > time())
{
    // check if an event occured
    $res = mysql_query('SELECT * FROM event WHERE `eid`="'.$eid.'" AND `mnr`="'.$mnr.'"');
    if (mysql_num_rows($res) > 0)
    {
        // event occured
        $row = mysql_fetch_assoc($res);
        $msg = $row['msg'];
        echo "<event eid="$eid" mnr="$mnr" msg="$msg" />n";
        die();
        //die('event occured: '.$msg."<br>nNext mnr=".($mnr+1));
        //break;
    }
    else
    {
        // no event occured
        mysql_free_result($res);
        sleep(WAIT_INT);
    }
}
die(WAIT_MAX . ' seconds passed and no event occured.');

Bob向yell.php发送消息,提供$msg

if (isset($_GET['msg']))
    $msg = $_GET['msg'];
else
    $msg = 'no message given, just firing the event.';
mysql_query('INSERT INTO `event` (`eid`, `mnr`, `msg`) VALUES ("'.$eid.'", "'.$mnr.'", "'.$msg.'")');

一些init.php使其工作:

$eid = -1;
$mnr = -1;
if (isset($_GET['eid']) && isset($_GET['mnr']))
{
    $eid = max(0, (int)$_GET['eid']);
    $mnr = max(0, (int)$_GET['mnr']);
}
elseif (isset($_GET['eid']))
{
    $eid = max(0, (int)$_GET['eid']);
    $mnr = 1;
}
else
    die('no eid given');

根据需要使用和修改此代码。

相关内容

最新更新