Ajax聊天 - 只有在有变化时才更新

时间:2010-06-11 17:34:28

标签: php javascript ajax chat

我目前有一个基于Ajax的聊天,我试图通过仅在发生更新时加载聊天脚本来简化。因此,如果数据库中没有任何变化,则无需继续加载。

我现在的逻辑说:

  • JavaScript函数每1/2秒触发一次以获取聊天记录(setInterval()

如果没有任何改变,那么继续调用它似乎相当低效。相反,我想做的是:

  1. JavaScript函数检查数据库中是否有 new 日志
  2. 如果是 - 加载新日志,如果否 - 单独保留当前显示的日志。
  3. 但我怎么会这样呢?我目前使用的功能是:

    function updateShouts() {
        $('#chatArea').load('chat.php'); // load chat logs
    }
    setInterval("updateShouts()", 500);  // call function every half a second
    

5 个答案:

答案 0 :(得分:3)

我会将timestamp s(或message_id s)与服务器端脚本发送给客户端的任何聊天消息一起传递。然后客户端只询问新消息,服务器只发送新消息。

因此,假设每条聊天消息都有一个ID。我设计我的chat.php接受这样的参数:

chat.php?since=12345

12345将是客户端看到的最后一条消息的idchat.php基本上是这样的:

SELECT * FROM chatmessages WHERE id > $since

...并传回一个漂亮的小数据结构(一个对象数组,用JSON编码,比如说)。

因此,如果没有新的聊天消息,服务器只是传回一个空数组。

我认为你不能比那更有效率。

编辑:

我意识到这样做需要更多的客户端编码。您不再只是使用整个聊天记录更新某个div。您还需要在ajax调用上拥有一个迭代结果的处理程序,对于每条消息,以编程方式为该行构建div,然后将其附加到聊天div

答案 1 :(得分:1)

一种相对简单的方法是使用AJAX来获取一个页面,该页面只是告诉您是否有任何更新。例如,您可以获取类似checkForUpdate.php的页面,其中包含1或0,以指示聊天中是否有新内容。如果你有1回,你可以继续加载完整的chat.php页面。

(如果您以前没有使用过AJAX,这是一个非常好的教程:http://www.tizag.com/ajaxTutorial/

另一个解决方案(我认为可能更好)是加载一个只有最新聊天行的页面。例如,假设您当前正在显示聊天的第1-14行。然后,您可以使用AJAX来获取内容,例如getLines.php?s=14。此页面仅显示第14行之后的聊天行。然后,您只需将这些行附加到当前聊天窗口的末尾。

答案 2 :(得分:0)

如您所知,.load函数使用chat.php文件返回的输出填充元素。这个.load函数执行两个步骤:它向chat.php发出一个ajax请求,然后将该元素的值设置为chat.php的输出。你想做的只是第一步。为此,请使用.ajax函数

http://api.jquery.com/jQuery.ajax/

我建议调用不同的脚本,如isChatUpdated.php,而不是使用chat.php文件。该脚本将像名称建议一样执行,并检查聊天中是否有任何更改。然后,您可以使用该结果确定是否需要调用.load函数。

答案 3 :(得分:0)

无论哪种方式,您都需要在服务器端查询数据库,因此如果返回日志数据或单个值,则几乎无关紧要。
您可以根据返回值决定不更新#chatArea,但是您必须再次调用以检索日志,否则。

答案 4 :(得分:0)

我首先创建一个名为messages.php的文件,看起来像这样:

<?php header('Content-Type: application/json');

$messages_since = !empty($_POST['since']) 
    ? mysql_real_escape($_POST['since']) 
    : '0000-00-00 00:00:00');

// Get all messages from database since the $messages_since date_time

echo json_encode($array_with_messages);

然后在客户端使用jQuery或类似的东西,我会做这样的事情:

  1. 使用$.post('messages.php', new_messages_handler)
  2. 之类的内容获取消息
  3. 在处理程序中,我会为我们收到的每条新消息创建html,并将其添加/添加到聊天容器中,并存储最新消息的创建时间。
  4. 等一会儿
  5. 使用$.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
  6. 之类的内容获取新消息
  7. 转到2
  8. 至少它在我的头脑中非常好用:p