2014-04-03 108 views
1

所以我正在尝试使用AJAX和PHP在JavaScript中创建一个聊天程序。我目前正在更新这样的聊天,我敢肯定,这是很难我的服务器上:如何正确处理聊天页面中的“聊天更新”?

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

这是什么文件名为Ajax的负载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%,但我不知道从哪里开始。我该如何处理这个更好?

+0

你是否仅限于使用php? – xCNPx

+0

嗯,不。我也使用JS。 – CyanPrime

+0

我想我的意思是,你有没有探索过PHP的替代品,比如node.js? – xCNPx

回答

2

给这个表一个int自动增量id。跟踪收到的最高ID(可能在会话中),并且在下一轮投票中只查找高于该ID的ID(即仅查找自上次投票后创建的记录)。

0

这将是我的建议,以处理您的聊天系统更好:

1)我会建议使用双链的setTimeout,而不是setInterval的

为什么?假设加载时间超过3秒。然后setInterval会打败它,并导致发生超过1个XML HTTP请求,导致浏览器中的压力。

这是一个连锁的setTimeout会是什么样子在你的榜样:

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

2)代替Ajax的负载messages.php编写HTML的,你可以回来JSON对象json_encode()回应。然后,如果您跟踪当前显示的数组中的每个聊天实例的消息,则可以确定是否有新消息(developerwjk的答案是一个好建议)。这样,您不必每3秒重新加载DOM(不管是否有新消息)。当然,你需要知道浏览器中的内存使用情况。

===

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

+0

谢谢。这个“推送系统”的东西,我一直听到它,但我无法找出它的实际意义,或如何去做。你有什么想法从哪里开始? – CyanPrime

+0

我之所以说可能难以实现,是因为它需要了解websockets以及它如何与PHP一起工作。如果你使用过node.js和socket.io,那么它很容易得到推送系统。 – hrgui