在不使用 jquery/ajax 的情况下自动将新记录插入到表中时,使用新记录更新页面的另一种方法是啥
Posted
技术标签:
【中文标题】在不使用 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/ajax 的情况下自动将新记录插入到表中时,使用新记录更新页面的另一种方法是什么 【发布时间】:2011-07-29 13:33:12 【问题描述】:我用 jquery、php 和 mysql 编写了一个小型聊天系统;但是,我正在寻找一种仅在将新记录插入一行时才更新 a 的技术。我觉得每秒使用 jquery ajax 调用来检索新记录在我的服务器上真的是过度杀伤和费力。
【问题讨论】:
【参考方案1】:据我所知,您可以选择几条路线。
长轮询。这是浏览器打开到服务器的连接并且在服务器响应之前什么都不做的地方。一旦服务器响应或超时(向浏览器发送一个空响应),就会发出一个新的长轮询请求。
走这条路线时,您应该使用不依赖于为每个请求使用新线程的服务器。
Web 套接字。 同样,您需要一个能够处理请求而不需要为每个请求生成新线程的服务器。使用 Web 套接字,客户端和服务器之间的连接保持打开状态,并且与长轮询不同,它不会超时。但是,这还没有得到很好的支持。
我强烈建议您查看 http://socket.io/
【讨论】:
【参考方案2】:您正在寻找 Comet 解决方案:http://en.wikipedia.org/wiki/Comet_%28programming%29
正如 pdr 所指出的,这个想法是让 javascript 不断地向服务器打开一个异步请求。服务器保持打开状态,但在确定有要发送的内容之前不发送任何内容。请求将在 10-20 秒后在 javascript 端超时,之后它应该重新打开连接。
这使用基于“订阅者”的模型,服务器将通过该模型一次性向所有订阅的客户端发送聊天消息或您拥有的内容。这可以为您节省许多数据库请求,因为请求请求的是服务器,而不是单个客户端。
【讨论】:
【参考方案3】:你想要的是long polling。基本上,您创建一个 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 会认为事情是错误的。 :)
【讨论】:
值得注意的是,Apache 通常不是一个非常适合长轮询的服务器。 @simshaun 你推荐什么服务器?干杯。【参考方案4】:对于标准的 html/CSS/JS,这几乎是唯一的方法,因为浏览器可以向服务器发出请求,反之亦然。 AJAX 调用根本不需要很大。根据定义,聊天系统需要大量访问服务器。
【讨论】:
【参考方案5】:Ajax 的关键在于它是异步的。你能不能只在服务器上等待,直到有值得发送的响应?
【讨论】:
以上是关于在不使用 jquery/ajax 的情况下自动将新记录插入到表中时,使用新记录更新页面的另一种方法是啥的主要内容,如果未能解决你的问题,请参考以下文章