PHP重新加载聊天框?

时间:2012-02-20 15:24:56

标签: php javascript html ajax

我在PHP中创建了一个类似于聊天框的聊天框。唯一的问题是它不会自动重新加载。有没有办法让它在PHP中重新加载,或者我是否必须移动一切所以我可以使用AJAX?此外,我的一个用户经常在线。我将它设置为离线,如果他们在最后3分钟内按下了一个键或点击了它们,并在他们离开页面时将它们设置为离线。他们使用的是Firefox 9.0。这是因为使用了onunload吗?什么是解决方案?

3 个答案:

答案 0 :(得分:4)

您可以使用可由PHP生成的meta refresh标记,但它不是特定于PHP的功能。

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

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

Ajax可能是检查用户不活动的首选方法。以下是关于检查用户活动的类似帖子 - How can I detect with JavaScript/jQuery if the user is currently active on the page?

<强>更新

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

我们在ASP.Net MVC应用程序中遇到过类似的情况。我们最终使用Application Variables来存储最近的活动和用户状态。一个php示例可以是found here

希望这有帮助!

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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');

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