【问题标题】:The overheads of using setInterval to get latest data from database使用 setInterval 从数据库中获取最新数据的开销
【发布时间】:2012-02-19 18:15:38
【问题描述】:

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

代码示例:

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

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

【问题讨论】:

    标签: php jquery sql ajax database


    【解决方案1】:

    您可能想查看Socket.IO,它适用于与服务器的实时通信。然后,您可以设计后端以在数据可用时将数据推送到客户端,而不是不断地轮询数据库以获取来自前端的新信息

    【讨论】:

      【解决方案2】:

      HTML5 Web Sockets 允许客户端和服务器之间进行双向通信...

      【讨论】:

        【解决方案3】:

        在我看来,您应该只请求插入数据库中的最后一个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.
        

        【讨论】:

          【解决方案4】:

          听起来您希望您的网络应用程序在数据库中发生更改时接收数据,但不一定要实时发送数据。如果需要双向通信,那么您正在寻找 Socket.IO 将在服务器端帮助您但要求您运行 Node 服务器的 Web 套接字。有一个为 PHP 启用 Web Sockets 的 Google 代码项目,名为 PHPWebSocket,但如果我没记错的话,它要求您在单独的进程中运行它(即从命令行运行它)。所以那种照顾服务器部分,但现在你必须担心前端。

          目前只有 FireFox 和 Chrome 完全支持 Web Sockets according to CanIUse。对于那些缺乏支持的浏览器,你需要一个 polyfill。 Here is a list of HTML5 polyfills。所以 Web Sockets 实现起来可能有点混乱,所以请确保这是您想要做的。

          另一方面,如果您的 web 应用程序只需要接收数据,那么 EventSource(也称为服务器发送事件)是可行的方法。 The support is better 在前端,您实际上不必在服务器上做太多事情。同样,对于不太出色的浏览器,您将需要一个 polyfill,但这几乎只意味着 IE。请参阅以下网站/教程了解如何使用此功能。

          如果这些都不起作用,则有几个选项。使用某种重复结构(如 setTimeout)进行持续轮询,长轮询(也称为挂起获取),其中服务器将 AJAX 请求保持打开状态,直到有新数据,还有无限 iframe 技巧,甚至可能是连接到服务器获取数据。

          【讨论】:

          • 嗯,我正在创建一个社交网络风格的网站,它有一个个人资料评论区和一个聊天区。人们一直在说我应该使用 websocket,而我一直在环顾四周,就像你说的一些浏览器缺乏支持,我真的希望最大限度地支持多种浏览器,就像 facebook 和 twitter。
          • 如果您想查看对方在输入时输入的内容,那么我会使用 Web Sockets。否则我会使用 EventSource 接收消息并使用普通 AJAX 发送消息。
          猜你喜欢
          • 2020-08-22
          • 1970-01-01
          • 1970-01-01
          • 2014-05-23
          • 2012-07-21
          • 2021-01-02
          • 1970-01-01
          • 2010-10-12
          相关资源
          最近更新 更多