使用数据库数据进行长轮询?

8
一周的搜索和查找后发现,关于从数据库表中实现长轮询(long polling)而非来自名为data.text的纯文本文件的教程屈指可数。目前,我手动将任何内容写入data.text并立即在浏览器中显示。
这是一个问题:使用数据库进行长轮询?即便是在StackOverflow上也没有得到恰当的回答。(在这里我找到了很多,但都无济于事。)这方面的示例也在此处提供:filemtime alternative for MySQL 如何修改getdata.php以使其能够从数据库中获取数据?
 $sql=mysqli_query($database,"SELECT * FROM messages  where time>=$curr_date ORDER by      time DESC");
  while($row=mysqli_fetch_array($sql)){
    $messages=$row['messages'];
    $id=$row['id'];
    echo $messages;
  }

以下是消息表

    id     fro   to  mesg      time  status  last_modified  

我这里举一个例子。 在这个例子中,使用了三个文件。

  1. index.html
  2. getdat.php
  3. data.text

如果不需要创建第四个文件来从数据库(mysql)获取数据,那么需要对getdata.php或data.text做哪些更改才能使用动态数据呢?

下面是我的Javascript代码:

<script type="text/javascript" charset="utf-8">

        var timestamp = null;

        function waitformsg() {
            $.ajax({
                type:"Post",
                url:"getdata.php?timestamp="+timestamp,
                async:true,
                cache:false,
                success:function(data) {
                    var json = eval('(' + data + ')');
                    if(json['msg'] != "") {
                        $("#messages").append(json['msg']);

                    }
                    timestamp = json["timestamp"];

                    setTimeout("waitformsg()", 1000);
                },
                error:function(XMLhttprequest, textstatus, errorthrown) {
                    alert("error:" + textstatus + "(" + errorthrown + ")");
                    setTimeout("waitformsg()", 15000);
                }




                });

        }
        $(document).ready(function() {

            waitformsg();
        });
    </script>

这是getdata.php文件

<?php
include("../model/includes/classes.php");

$filename='data.php';

$lastmodif=isset($_GET['timestamp'])?$_GET['timestamp']:0;
$currentmodif=filemtime($filename);

while($currentmodif<=$lastmodif){
    usleep(10000);
    clearstatcache();
    $currentmodif=filemtime($filename);
}

$response=array();
$response['msg']=file_get_contents($filename);
$response['timestamp']=$currentmodif;
echo json_encode($response);
?>

1
欢迎来到Stack Overflow。如果您澄清问题,它将帮助您获得答案。看起来您正在创建一个Web页面(也称为Javascript中的客户端应用程序),该页面应使用ajax轮询服务器。似乎您希望第一个ajax请求获取getdata.php中已存储的所有消息,并且对于随后的请求,检索自最近请求以来出现的任何新消息。是这样吗?此外,请显示您的“messages”表的定义。 - O. Jones
@OllieJones 感谢您的回复。您似乎是我解决这个问题的最后希望。确切地说,我正在使用长轮询技术构建聊天应用程序。消息表只是一个标准的聊天表,包括id、to、from、message和time列。 - Aana Saeed
1个回答

3

我最近做了一些非常相似的事情。我使用了jQuery .ajax调用而不是通用的XMLhttprequest,但是思路是相同的:

recentFunction(container, lastDate){
    var lastDate = "";

    return $.ajax({
        type: "POST",
        url: "getData.php",
        cache: false,
        data: { 'request': 'recent',
            'param': lastDate },
        dataType: "json",
        success: function(data){
            if(data != null){
                $.each(data, function(key, value){
                    if(key == 0){
                        lastDate = value['date_added'];
                    }
                    var html = "some html here";
                    // append html to dom element here
                                // and delete any old items here if needed
                });
            }
        },
        complete: function(){
            setTimeout(function(){recentFunction(container, lastDate)}, 7000);
        }
    });
}

getData.php文件中,我有一个查询语句,其中包含一个where子句,用于获取数据库中比最后一个元素更近的任何项。$lastDate的默认值设置为0,因此如果没有提交日期,它将返回所有项目。
<?php

$lastDate = 0;
$recent = array();
$recentQuery = "SELECT id, date FROM someTable WHERE date > '" . $lastDate . "'";
$recentResults = $db->query($recentQuery);

while($r = $recentResults->fetch_array(MYSQLI_ASSOC)){
      $recentMovies[] = $r;
}

echo json_encode($recentMovies);

?>

谢谢。但问题是在getdata.php中应该在哪里以及如何放置SQL语句? - Aana Saeed
无论您将其放在哪里都没有关系。只需像平常一样执行SQL查询,从数据中构建一个数组(可能来自多个查询),然后输出结果数组即可。最后一行只需要是“echo json_encode($output);”。我想您也可以输出XML或者只是文本。 - DominicM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接