dpge74512 2012-12-07 10:13
浏览 23

这是一次真正的长期民意调查吗?

After lot of trials,I am successfully able to maintain continous server connection with database. Now code keet cheking and show the messages,if there are new in database.

Plz review and tell if there is true long polling technique used in this code? If it is not,then plz suggest,where I am wrong(deviating from long polling) and how this can be made a true long polling.

Currenlty,I am getting these errors.However still it maintains the continous connection with database.

  1. each time,Only one message is pulled instead of all.(I used .each loop but it stops the long polling)
  2. After every 10/15 seconds,token error apperes(Parse erroe(syntax error=unexpected token)).

    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 file is here

 $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);
  • 写回答

1条回答 默认 最新

  • dqnek0079 2012-12-07 15:46
    关注

    Polling is a bit harder than a simple while : just because generally all things you output to the browser will be interpreted when complete. Your example is quite clear :

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

    jQuery will wait until the response is complete to build your data variable and then will call your success callback.

    One way to create long-polling is to have a task and a follower :

    • the task is the "infinite" loop, it displays nothing but just catch and trigger events, put in a "box".

    • the follower is an ajax call made every X seconds, it looks inside the "box" filled by the task, and immediately act inside the page.

    Here is an example of long-polling, there is no follower, just an event (release) that stops the poll, but you'll get the idea :

    <?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>
    

    Demonstration : here.

    评论

报告相同问题?

悬赏问题

  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程