在不使用jquery/ajax的情况下,用新记录自动插入到表中,有什么替代方法来更新页面?


Whats an alternative way of updating a page with new records as they are inserted into a table automatically without using jquery/ajax

我用jquery、php和mysql编写了一个小的聊天系统;然而,我正在寻找某种技术,只会更新,如果一个新的记录被插入一行。我觉得使用jquery ajax调用每秒检索新记录对我的服务器来说真的是多余的和费力的。

您正在寻找Comet解决方案:http://en.wikipedia.org/wiki/Comet_%28programming%29

这个想法,正如pdr所指出的,是javascript不断打开与服务器的异步请求。服务器保持打开状态,但是在确定有东西要发送之前不发送任何东西。请求将在10-20秒后在javascript端超时,之后它应该重新打开连接。

这使用了基于"订阅者"的模型,通过该模型,服务器将发送聊天消息或诸如此类的信息给所有订阅的客户端,所有这些都是一次性的。这为您节省了许多数据库请求,因为服务器是请求请求的一方,而不是单个客户机。

您需要的是长轮询。基本上,您创建一个XHR,服务器和PHP保持请求打开,直到准备好发送回新数据。

在这种情况下,您需要配置Apache不超时,所以要做一些实质性的研究。基本上,PHP看起来像这样…

set_time_limit(0);
while (TRUE) {
   $db->query('SELECT `message` FROM `messages` WHERE `new` = TRUE');
   if ($db) {
       echo json_encode($db->results());
       exit;
   }
   sleep(1);
}

然后,为该页创建一个XHR,它将保持打开状态,直到新数据准备好。然后,在完成回调时,更新页面的状态并创建一个新的XHR。

这比使用XHR连续轮询更新要有效得多。

确保你做了大量的研究,因为我相信如果一个PHP脚本在30秒左右没有停止,Apache会认为事情是错误的。:)

我知道有几条路线你可以走。

  1. 长轮询。浏览器打开到服务器的连接,在服务器响应之前不做任何事情。一旦服务器响应或超时(向浏览器发送一个空响应),就会发出一个新的长轮询请求。

    当你走这条路时,你应该使用一个不依赖于为每个请求使用新线程的服务器。

  2. 网络套接字。同样,您将需要一个能够处理请求的服务器,而不是每个请求都生成一个新线程。使用web套接字,客户端和服务器之间的连接保持打开状态,并且与长轮询不同,它不会超时。但是,这还没有得到很好的支持。

我强烈推荐大家看看http://socket.io/

Ajax的关键在于它是异步的。难道你不能在服务器上等待,直到有值得发送的响应?

对于标准的HTML/CSS/JS,这几乎是唯一的方法,因为浏览器可以向服务器发出请求,反之亦然。AJAX调用不应该非常大。顾名思义,聊天系统需要经常访问服务器。