所以我正在尝试使用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%,但我不知道从哪里开始。我怎样才能更好地处理这个?
答案 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 +)使用推送系统而不是轮询。如果有新消息,服务器会推送到客户端。这减少了对服务器的请求数量,但实现起来可能更困难。