使用setInterval从数据库中获取最新数据的开销

时间:2012-01-26 16:43:45

标签: php jquery sql ajax database

我创建一个消息传递功能,每隔几秒就从数据库中获取最新消息,基本上这种方法会进行连续数据库搜索以显示新消息。

代码示例:

 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);
            });              
        }
    });   
}

我想知道的是,是否有更有效的方法来执行此任务,即检测数据库中的更改(???)。

4 个答案:

答案 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.