【问题标题】:How to make ajax long polling with php - mysql如何使用 php - mysql 进行 ajax 长轮询
【发布时间】:2014-03-22 11:29:35
【问题描述】:

我编写了 php 代码,它从 Asks 表中获取未读取的行:

$sqlanum = "SELECT id FROM asks WHERE answer='' AND profile='1' AND askdate>now()";
$queryanum = mysqli_query($db_conx, $sqlanum);
$rowanum = mysqli_num_rows($queryanum);

我不熟悉 Ajax 长轮询,我只是阅读了一些内容,在搜索了简单的 Ajax 长轮询示例后,我做了这样的事情:

$.ajax({
        type: "GET",
        url: "chkasks.php",

        async: true, /* If set to non-async, browser shows page as "Loading.."*/
        cache: false,
        timeout: 50000, /* Timeout in ms */

        success: function(data){ /* called when request completes */
            //addmsg("new", data);
            setTimeout(chkAsks, 1000);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
            setTimeout(chkAsks, 3000);
        }
    });
};

但我不知道如何使其循环并在有结果时中断并继续循环我没有结果...

【问题讨论】:

  • 从我几年前的尝试来看,许多流行的 Web 服务器以及浏览器都存在这个问题,因为它们不会刷新数据直到某个限制。我希望有人能带来更多的见解,因为我也很感兴趣。我也认为你所指的是“彗星”。
  • 感谢您的回复....但我认为 Facebook 正在使用长轮询
  • 如果我理解得很好,您想每隔 X 秒检查一次 $rowanum 的值,并根据其值更改客户端的行为?
  • 不,我想每 1 秒检查一次 $rowanum 的值,但除非有 $rowanum 的值,否则不返回任何内容

标签: php mysql ajax json long-polling


【解决方案1】:

在您的 PHP 中,您可以添加 echo $rowanum;,它会在您的 JavaScript 中的 data 变量中发送 $rowanum 的值。

然后,您可以将成功回调更改为:

/* .... */
success : function(data) {
    if(data == 0) {
         setTimeout(chkAsks, 1000); //Where chkAsks is the function from which the ajax request is fired
    } else {
          console.log('$rowanum=' + data);
    }
} 
/* .... */

我不确定它是否正是您正在寻找的......

【讨论】:

  • 谢谢,但在 php 文件中,如果没有数据会做什么,如果没有数据,我不希望 javascript 做任何事情...
  • 没有数据,你的意思是 $rowanum = 0 ?因为mysqli_num_rows 总是返回一个值。因此,您可以在您的 PHP 脚本中执行 if ($rowanum != 0) { echo $rowanum; } 并检查 JS 中的数据是否为空 (if (data == "") { }),或者始终回显 $rowanum 的值并检查您的 JS 是否等于 0。
  • 如果 $rowanum = 0 并且 php 一直返回 0,这意味着我正在使用短轮询,这会导致服务器宕机......我想进行长轮询,所以它确实如此'如果 $rowanum = 0 则不返回任何内容并且它一直在循环...
  • 我认为你必须在服务器端处理它。您可以在 $rowanum != 0 时循环您的 SQL 查询,但是您需要在每个查询之间暂停(使用 sleep())您的脚本(否则您的服务器将消耗所有 CPU 并使其他请求非常慢)。如果 $rowanum != 0,则退出循环并打印其值。这样 ajax 将等到 $rowanum 为 != 0。我从来没有这样做过,但我想它可以工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2013-10-01
  • 2016-08-14
  • 2015-10-02
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多