2

我正在尝试在我的内部网络上实现一个长轮询系统,大多数用户使用 IE,有些用户也使用移动设备,这就是为什么我尝试使用长轮询而不是 websockets 来实现它。

我关注了这个视频 http://www.screenr.com/SNH并编辑了一些代码来使用我的数据库。(火鸟)

一切似乎都很好,但它并没有打破循环。也许这是一个孩子的错误,但我看不到,这就是为什么我需要你的帮助!

这是代码:

jQuery + Ajax:

var timestamp = null;

function waitForMsg(){      
    $.ajax({
        type: "GET",
        url: "getData.php?timestamp=" + timestamp,
        async: true,
        cache: false,

        success: function(data){
            alert('It Works');
            var json = eval('(' + data + ')');
            timestamp = json['timestamp'];
            setTimeout('waitForMsg()',15000);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
            alert("A - " + XMLHttpRequest + " - error: " + textStatus + " (" + errorThrown + ")");
            setTimeout('waitForMsg()',15000);
        }
    });
}

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

</script>

getData.php('DATAHORA' 是时间戳字段)

<?php
    set_time_limit(0);
    @ini_set("memory_limit",'64M');

    require_once('../classes/conexao.php');

    $banco = Conexao :: getConexao();
    $sql = "SELECT FIRST 1 DATAHORA FROM AGENDAMENTOSBBM ORDER BY DATAHORA DESC";
    $res = $banco->execute($sql);
    $dados = $banco->fetch($res);
    if($dados)
        $currentmodif = $dados['DATAHORA']);
    else
        $currentmodif = 0;

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

    while( $currentmodif <= $lastmodif ){
        usleep(10000);
        $sql = "SELECT FIRST 1 DATAHORA FROM AGENDAMENTOSBBM ORDER BY DATAHORA DESC";
        $res = $banco->execute($sql);
        $dados = $banco->fetch($res);
        if($dados)
            $currentmodif = $dados['DATAHORA']);
        else
            $currentmodif = 0;
    }

    $response = array();
    $response['timestamp'] = $currentmodif;
    echo json_encode($response);

?>

当我插入、更新或删除一些数据时,时间戳字段会更新为当前时间戳。我可以看到页面进入了循环,但我不知道为什么它永远不会结束。

难道我做错了什么?

谢谢

4

6 回答 6

2

我终于找到了解决方案。

它是如此简单。我的代码没有关闭与ibase_close

我所做的是在完成查询过程时将其更改为关闭。然后在循环内,我需要再次重新连接服务器。

天哪,我怎么能忘记这一点。

感谢大家。

于 2013-09-19T17:08:32.937 回答
1

尝试在 while 循环中替换$currentmodif = $dados['DATAHORA']);为。$currentmodif = $dados['HORA']);

您要求一个不存在的数组键,该键始终为空,因此如果$lastmodif不为空,您的循环将永远运行。

于 2013-09-19T00:32:06.873 回答
1

改变$currentmodif = $dados['DATAHORA']);,看:

<?php
set_time_limit(0);
@ini_set("memory_limit",'64M');

require_once('../classes/conexao.php');

$banco = Conexao :: getConexao();
$sql = "SELECT FIRST 1 DATAHORA FROM AGENDAMENTOSBBM ORDER BY DATAHORA DESC";
$res = $banco->execute($sql);
$dados = $banco->fetch($res);
if($dados)
    $currentmodif = $dados['DATAHORA']);
else
    $currentmodif = 0;

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

while( $currentmodif <= $lastmodif ){
    usleep(10000);
    $sql = "SELECT FIRST 1 DATA, HORA FROM AGENDAMENTOSBBM ORDER BY DATA DESC,HORA DESC";
    $res = $banco->execute($sql);
    $dados = $banco->fetch($res);
    if($dados)
        $currentmodif = $dados['DATA'].$dados['HORA']; // Before : $dados['DATAHORA']);
    else
        $currentmodif = 0;
}

$response = array();
$response['timestamp'] = $currentmodif;
echo json_encode($response);

?>

我不知道您的数据库设计如何,所以我建议您自己更改也许您的错误就在这几行。但我不能决定,因为我没有时间修复它,我必须做我的项目。如果我错了,我很抱歉。祝你好运

于 2013-09-19T08:32:58.197 回答
1

在重写 MySQL 中的代码并思考为什么它似乎工作正常之后,我发现了问题:

您需要将初始值设置var timestamp为 0,而不是 null。如果将其设置为 null,jQuery 会将其作为字符串“null”(?timestamp=null) 发送。在 PHP 中,它会将此字符串“null”与任何数字$currentmodif进行比较,因此最终您将永远不会进入您的 while 循环。

于 2013-09-19T14:35:58.620 回答
0

尝试评估您的查询并查看它们返回的内容,以便您可以验证返回的数据并确保数组$dados具有访问数组中任何数据所需的数据和键$dados

于 2013-09-19T01:03:15.540 回答
0
var longpollError = false;
function longPoll(){
    $.ajax({
        url: "socialPolling",
        type: 'GET',
        dataType: 'json',
        data: {param1: 'value1'},
        timeout: 30000 // timeout every 10 sec
      }).done(function(dataJson) {

        //Success code goes here

      })
      .fail(function(data) {
         longpollError = true; //mark this to true if there is an error

      }).always(function(data) {
        if(longpollError==false){ //if there is no error request it again
          setTimeout(function() {
            longPoll();
          }, 3000);

        }

      })
}
于 2015-11-30T11:41:35.783 回答