如何正确处理"聊天更新"在聊天页面?

时间:2014-04-03 20:26:58

标签: javascript php jquery ajax chat

所以我正在尝试使用AJAX和PHP在JavaScript中创建聊天程序。我目前正在更新这样的聊天,我确信它在我的服务器上很难:

<div id="messages">[no messages]</div>

这是名为ajax-load-messages.php

的文件中的内容
<?php
    $sql_posts_result = mysql_query("SELECT Post FROM Posts ORDER BY Date ASC LIMIT 50", $db) or die("Can't load post"."<br/>".mysql_error());

    if(!empty($sql_posts_result)){
        while($row = mysql_fetch_row($sql_posts_result)){
            echo '<div class="message-post">'.$row[0].'</div>';
        }
    }
?>

这是由这个javascript调用的:

setInterval(function(){
        $('#messages').load('/ajax-load-messages.php');
    }, 3000);

所以我每3秒钟将最后50条消息加载到#messages div。 我知道有一种方法可以处理这种情况甚至不像资源密集型的10%,但我不知道从哪里开始。我怎样才能更好地处理这个?

2 个答案:

答案 0 :(得分:2)

为表提供一个int autoincrement id。跟踪收到的最高ID(可能在会话中),并且在下次轮询时只查找高于该值的ID(即仅记录自上次轮询以来创建的记录)。

答案 1 :(得分:0)

这些是我更好地处理聊天系统的建议:

1)我建议使用chained-setTimeout而不是setInterval

为什么?假设加载时间超过3秒。然后setInterval将击败它并导致多个XML HTTP请求发生,从而导致浏览器出现压力。

这是链接的setTimeout在您的示例中的样子:

setTimeout(function loadMessages() { 
   $("#messages").load('/ajax-load-messages.php', function onLoadMessagesComplete(responseText, textStatus, xmlHttpRequest) { 
      setTimeout(loadMessages, 3000);
 });
}

2)您可以使用JSON对象json_encode()回复,而不是在ajax-load-messages.php中编写HTML。然后,如果您跟踪当前显示的数组中的每个聊天实例的消息,那么您可以确定是否有新消息(developerwjk的答案是一个很好的建议)。这样,您不必每3秒重新加载一次DOM(无论是否有新消息)。当然,您需要了解浏览器中的内存使用情况。

===

通常聊天系统(如Facebook,Google +)使用推送系统而不是轮询。如果有新消息,服务器会推送到客户端。这减少了对服务器的请求数量,但实现起来可能更困难。