如何在不使用javascript超时的情况下实现聊天应用程序?

时间:2011-12-22 07:35:37

标签: php mysql

我想实现一个聊天应用程序,但我不想使用超时,因为它每隔几秒检查一次。有没有其他方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

你可以使用ajax调用一个php页面,该页面会挂起,直到有新的东西然后将它发送给客户端,并且在ajax使用它得到的内容后,它可以向该页面发出另一个请求,又挂了。这样您就可以将请求交换到服务器以进行服务器处理。您可以使用usleep和while循环来保持页面处于活动状态,并且不要忘记设置页面的执行时间限制。

编辑1:

好吧,我假设您有一个函数来发送数据(我将其称为request),并异步等待响应,并且您将函数链接到响应时执行。我们称之为函数listen

另一个函数send发送用户或其他任何内容的回复。 sendlisten都会请求相同的网页,其中一个网页没有POSTGET数据(listen),另一个网页请求POST数据包含回复或其他内容。

初始请求将使用listen完成,或者当您想要手动启动侦听器时以及响应之后。另一个是在你发送东西时调用的。

重要的是php代码。

如果你在linux环境中工作,你可以使用很多东西,比如os信号,但一般来说我们可以使用while和usleep,这样我们就不会杀死服务器。

现在:

<?php

// code for mysql
if(isset($_POST))
{
    mysql_query("INSERT INTO table (user,instance,date,reply) VALUES('".$_SESSION['user']."','room','etc','".mysql_real_escape_string($_POST['reply'])."')");
    $_SESSION['last_reply_id'] = mysql_insert_id();
}

while(true)
{
    $rez = mysql_query("SELECT * FROM `table` WHERE `id` > '".$_SESSION['last_reply_id']."' ORDER BY `id` DESC");

    $repls = array();

    if(count($rez))
    {
        while($rez = mysql_fetch_array($rez))
        {
            $repls[] = $rez;
        }
        $_SESSION['last_reply_id'] = $repls[0]['id'];
        echo json_encode($repls);
        break;
    }
    else
    {
        usleep(200000);
    }
}
?>

现在,你首先调用listen,它将等到它回显制动循环,当它发生时,你使用结果,然后再次调用listen。如果你想发送一些东西,你使用send,它必须制动前一个请求并创建一个新的,在写入数据之后将启动监听器。等等,我希望你有这个想法,告诉我你是否想澄清它。

不要忘记在页面开头使用set_time_limit(0);

我可能有点偏离,需要查看此代码,但这是主要想法。

答案 1 :(得分:0)

嗯,任何方法都需要每隔几秒检查一次数据库,或者需要多长时间来检查数据库。

Javascript中唯一的另一种方法是setInterval(代码,时间),每隔“时间”执行一次代码。

只是为了澄清,如果您希望聊天能够在不重新加载页面的情况下自动更新。

答案 2 :(得分:0)

类似的问题以前已经好几次了。我几天前发布了this answer,建议使用Websocket或Node.js.也许这可以让你开始。