我目前有一个基于Ajax的聊天,我试图通过仅在发生更新时加载聊天脚本来简化。因此,如果数据库中没有任何变化,则无需继续加载。
我现在的逻辑说:
setInterval()
)如果没有任何改变,那么继续调用它似乎相当低效。相反,我想做的是:
但我怎么会这样呢?我目前使用的功能是:
function updateShouts() {
$('#chatArea').load('chat.php'); // load chat logs
}
setInterval("updateShouts()", 500); // call function every half a second
答案 0 :(得分:3)
我会将timestamp
s(或message_id
s)与服务器端脚本发送给客户端的任何聊天消息一起传递。然后客户端只询问新消息,服务器只发送新消息。
因此,假设每条聊天消息都有一个ID。我设计我的chat.php
接受这样的参数:
chat.php?since=12345
12345
将是客户端看到的最后一条消息的id
。 chat.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或类似的东西,我会做这样的事情:
$.post('messages.php', new_messages_handler)
$.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)
至少它在我的头脑中非常好用:p