我创建一个消息传递功能,每隔几秒就从数据库中获取最新消息,基本上这种方法会进行连续数据库搜索以显示新消息。
代码示例:
function getLatestActivities(){
var ignoreMessagesArr = $("input.activityId").map(function(){ return this.value; }).get().join(",");
var profileId = $("input#userActivityId").val();
$.ajax({
traditional: true,
dataType: "json",
type: "GET", url: "include/process.php",
data:{
getLatestActivity: "true",
toUser: profileId,
ignoreMessages: ignoreMessagesArr
},
success: function(data){
$.each(data, function (i, elem) {
$('.commentMessage').after(elem.value);
});
}
});
}
我想知道的是,是否有更有效的方法来执行此任务,即检测数据库中的更改(???)。
答案 0 :(得分:1)
您可能希望查看Socket.IO它是否适合与服务器进行实时通信。然后,您可以设计后端,以便在数据可用时将数据推送到客户端,而不是不断地从数据库中查询来自前端的新信息
答案 1 :(得分:1)
HTML5 Web Sockets允许客户端与服务器之间进行双向通信......
答案 2 :(得分:1)
听起来您希望自己的网络应用在数据库中发生变化时接收数据,但不一定要实时发送数据。如果需要双向通信,那么您正在寻找Socket.IO将帮助您服务器端但需要运行Node服务器的Web套接字。有一个Google代码项目可以启用名为PHPWebSocket的Web Sockets for PHP,但是,如果我没记错的话,需要在单独的进程中运行它(即从命令行运行它)。所以那种照顾服务器的部分,但现在你不得不担心前端。
目前只有FireFox和Chrome完全支持网络套接字according to CanIUse。对于那些缺乏支持的浏览器,您需要一个polyfill。 Here is a list of HTML5 polyfills。因此,Web套接字实现起来很麻烦,因此请确保这是您想要做的事情。
另一方面,如果您的webapp只需要接收数据,则可以使用EventSource(a.k.a。服务器发送事件)。前端The support is better,你不必在服务器上做太多事情。同样,对于不太出色的浏览器,你需要一个polyfill,但这只是意味着IE。请参阅以下网站/教程,了解如何使用此功能。
如果这些都不起作用,那么有一些选择。使用某种重复结构进行常量轮询,例如setTimeout,长轮询(又称挂起get)服务器将AJAX请求打开,直到有新数据,并且还有无限的iframe技巧,甚至可能是连接到服务器获取数据。
答案 3 :(得分:0)
在我看来,您应该只请求在数据库中插入的最后一个ID
,并将其作为参数添加到您的ajax请求中。
process.php
应处理ID
以及是否有其他行进行搜索。
像
$query = mysql_query("SELECT `ID` FROM `table` WHERE `ID`>'$lastId'");
$result = mysql_num_rows(); //use that to see if you have new rows.