这是真正的长轮询吗?

2024-01-14

经过多次试验,我成功地能够保持与数据库的连续服务器连接。

现在代码继续检查并显示消息,如果数据库中有新消息。

请审查并告知:

这段代码中是否使用了真正的长轮询技术?如果不是,那么请提出建议,我错在哪里(偏离长轮询)以及如何使其成为真正的长轮询。

目前,我收到这些错误。然而它仍然保持与数据库的持续连接。

  1. **每次只拉取一条消息而不是全部**(我使用了每个循环,但它停止了长轮询)

  2. 每 10/15 秒后,就会出现令牌错误 (解析错误(语法错误=意外的标记)).

    var last_msg_id = 2;
    
    function load_msgs() {
      $.ajax({
        type:"Post",
        url:"getdata.php",
        data:{
          last_msg_id:last_msg_id
        },
        dataType:"json",
        async:true,
        cache:false,
        success:function(data) {
          var json = data;
          $("#commidwin").append(json['msg']);
          last_msg_id = json["last_msg_id_db"];
          setTimeout("load_msgs()", 1000);
        },
        error:function(XMLhttprequest, textstatus, errorthrown) {
          alert("error:" + textstatus + "(" + errorthrown + ")");
          setTimeout("load_msgs()", 15000);
        }
      });
    }
    

PHP文件在这里

$last_msg_id=$_POST['last_msg_id'];
$last_msg_id_db=1;

while($last_msg_id>$last_msg_id_db){
    usleep(10000);
    clearstatcache();

    $sql=mysqli_query($db3->connection,"SELECT * FROM chat_com where id>'$last_msg_id' ORDER by id ASC");

    $sql_m=mysqli_query($db3->connection,"SELECT max(id) as maxid  FROM chat_com");
    $row_m=mysqli_fetch_array($sql_m);
    $last_msg_id_db=$row_m['maxid'];

    while($row=mysqli_fetch_array($sql)){
        $textt=$row['mesg'];

        $last_msg_id_db=$last_msg_id_db;
        $response=array();
        $response['msg']=$textt;
        $response['last_msg_id_db']=$last_msg_id_db;
    }
}

echo json_encode($response);

轮询比简单的 while 稍微困难一点:因为通常您输出到浏览器的所有内容都会在完成后被解释。你的例子很清楚:

success:function(data) {
    var json = data;
    $("#commidwin").append(json['msg']);
    last_msg_id = json["last_msg_id_db"];
    setTimeout("load_msgs()", 1000);
},

jQuery 将等待响应完成后再构建您的data变量,然后将调用您的成功回调。

创建长轮询的一种方法是拥有一个任务和一个关注者:

  • 该任务是“无限”循环,它只显示捕获和触发事件,放入“盒子”中。

  • follower 是每 X 秒进行一次 ajax 调用,它会查看任务填充的“框”内,并立即在页面内执行操作。

这是一个长轮询的例子,没有追随者,只有一个停止轮询的事件(发布),但你会明白的:

<?php

// For this demo
if (file_exists('poll.txt') == false)
{
    file_put_contents('poll.txt', '');
}

// If this variable is set, a long-polling is starting...    
if (isset($_GET['poll']))
{

    // Don't forget to change the default time limit
    set_time_limit(120);

    date_default_timezone_set('Europe/Paris');
    $time = time();

    // We loop until you click on the "release" button...
    $poll = true;
    $number_of_tries = 1;
    while ($poll)
    {
        // Here we simulate a request (last mtime of file could be a creation/update_date field on a base)
        clearstatcache();
        $mtime = filemtime('poll.txt');

        if ($mtime > $time)
        {
            $result = htmlentities(file_get_contents('poll.txt'));
            $poll = false;
        }

        // Of course, else your polling will kill your resources!
        $number_of_tries++;
        sleep(1);
    }

    // Outputs result
    echo "Number of tries : {$number_of_tries}<br/>{$result}";
    die();
}

// Here we catch the release form
if (isset($_GET['release']))
{
    $data = '';
    if (isset($_GET['data']))
    {
        $data = $_GET['data'];
    }
    file_put_contents('poll.txt', $data);
    die();
}
?>

<!-- click this button to begin long-polling -->
<input id="poll" type="button" value="Click me to start polling" />

<br/><br/>

Give me some text here :
<br/>
<input id="data" type="text" />
<br/>

<!-- click this button to release long-polling -->
<input id="release" type="button" value="Click me to release polling" disabled="disabled" />

<br/><br/>

Result after releasing polling :
<div id="result"></div>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">

    // Script to launch polling
    $('#poll').click(function() {
        $('#poll').attr('disabled', 'disabled');
        $('#release').removeAttr('disabled');
        $.ajax({
            url: 'poll.php',
            data: {
                poll: 'yes' // sets our $_GET['poll']
            },
            success: function(data) {
                $('#result').html(data);
                $('#poll').removeAttr('disabled');
                $('#release').attr('disabled', 'disabled');
            }
        });
    });

    // Script to release polling
    $('#release').click(function() {
        $.ajax({
            url: 'poll.php',
            data: {
                release: 'yes', // sets our $_GET['release']
                data: $('#data').val() // sets our $_GET['data']
            }
        });
    });

</script>

示范:here http://home.fuz.org/tests/poll.php.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是真正的长轮询吗? 的相关文章

随机推荐