jQuery - 延迟获取新消息

时间:2011-11-13 10:44:43

标签: php jquery ajax

我编写了一个聊天应用程序。一切正常。但我有一些延迟回应。

代码:

var lastMsgID = '0';

$(document).ready(function(){
    $("#submitmsg").click(function(){   
        var clientmsg = $("#usermsg").val();

        $.post("jqpost.php", {usermsg: clientmsg });                
        $("#usermsg").attr("value", "");
        return false;
    });

    setTimeout (poll, 500);
    //poll();
}
);

function poll(){
$.ajax({ 
    url: "jq.php", 
    type: "GET",
    data: "mid=" + lastMsgID,
    dataType: "json",  
    async: true,  
    cache: false,  
    timeout: 30000,  
    complete: poll,

    success: function(data){  
        //we got the msgs and will be displaying it... and update the variable 'lastMsgID' with the last id

 }}
);
}

服务器端(PHP):                 //查询数据库                 $ result = $ mysqli-> query($ sql);

    $wait_start = time();
    $wait_current = 0;
    while ($wait_current < 20 && $result->num_rows == 0)
    {
        usleep(200000); // 0.2 seconds
        $result = $mysqli->query($sql);
        $wait_current = time() - $wait_start;
    }


    if($result->num_rows > 0)
    {
                    //echo the new msgs...
            }

问题是,当我发送消息时,通过轮询接收它(以及任何新消息)大约需要9到15秒。

我已经检查过Firebug,发现“jqpost.php”的POST显示了一个加载图标,同时poll()发出的GET请求也显示了加载图标。 我认为,他们处于同步模式或等待响应。但$ .ajax设置为异步模式!

我是这个jQuery的新手。所以我请你原谅这个愚蠢的问题。 :) 我已经通过更改代码和其他一些东西尝试了调试。但并非没有成功。这就是我在这里发布的原因。

谢谢...

修改

jqpost.php代码:

if(isset($_SESSION['chatuser']))
{

if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    if(!isset($_POST['usermsg']) || empty($_POST['usermsg'])) 
        exit('Error');

    $stmt = $mysqli->prepare("INSERT INTO chat_tblMsg(m_name , m_uid , m_msg , m_time ) VALUES (? , ? , ? , CONVERT_TZ(NOW(), '-04:00' , '+05:30') )");
    $stmt->bind_param('sss', $_SESSION['chatuser']['uname'], $_SESSION['chatuser']['uid'], trim($_POST['usermsg']));

    /* execute prepared statement */
    $stmt->execute();
    /* close statement and connection */
    $stmt->close();
    /* close connection */
    $mysqli->close();

}
}

1 个答案:

答案 0 :(得分:0)

轮询查询是否持有数据库锁,阻止后查询执行?

如果您在睡觉前关闭$ result会发生什么:

while ($wait_current < 20 && $result->num_rows == 0)
{
    if (isset($result))
    {
        $result->close();
    }
    usleep(200000); // 0.2 seconds
    $result = $mysqli->query($sql);
    $wait_current = time() - $wait_start;
}