PHP重新加载聊天盒?

PHP重新加载聊天盒?,php,javascript,html,ajax,Php,Javascript,Html,Ajax,我用PHP做了一个类似聊天盒的东西。唯一的问题是它不会自动重新加载。有没有一种方法可以让它在PHP中重新加载,或者我必须移动所有东西才能使用AJAX?另外,我的一个用户经常在线。我已经设置为,如果他们在过去3分钟内按键或单击,则他们处于脱机状态,并在他们离开页面时将其设置为脱机状态。他们正在使用Firefox9.0。这是因为使用onunload吗?什么是解决方案?您可以添加一些JavaScript来自动刷新整个页面,但是使用AJAX对最终用户来说会更好。您可以使用一个元刷新标记,该标记可以由PH

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

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

您可以使用一个
元刷新
标记,该标记可以由PHP生成,但它实际上不是PHP特有的功能

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

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

Ajax可能是检查用户不活动的首选方法。下面是一篇关于检查用户活动的类似帖子-

更新

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

我们在ASP.NETMVC应用程序中遇到了类似的情况。我们最终使用应用程序变量来存储用户最近的活动和状态。可以使用一个php示例


希望这有帮助

Facebook的做法是,客户端“Alice”有一个待处理的新消息请求,打开时间约为1分钟。如果另一个客户端“Bob”向Alice写入消息,则服务器可以完成Alice的挂起请求。然后Alice立即收到新消息并打开一个新的挂起请求

您必须在大约一分钟后超时挂起的请求,否则浏览器会超时。不同的浏览器有不同的超时设置,所以只需使用一些小的设置。超时后,您将打开一个新的挂起请求,以避免遗漏任何内容

我有一些代码可以使用: 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.');
一些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');

您可以随意使用和修改此代码。

他也可以使用jQuery并加载到一些容器脚本get.php。我使用上述解决方案编写了聊天,效果很好。我使用AJAX作为“在不重新加载页面的情况下获取一些数据”的总称。是的,我使用AJAX将某人标记为脱机。因为我在他们不活动时使用的函数与他们离开页面时使用的函数相同,所以该函数似乎不适用于Firefox 9。0@shanabus,这是两个问题,第二个问题甚至没有细节。@Alexander,我想我已经回答了这个问题的第二部分。谢谢!
$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');