jQuery – 新しいメッセージの取得を遅らせる

私はチャットアプリをコーディングしました。すべてうまく動作します。しかし、私はいくつかの遅れた応答を持っています。

コード:

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

 }}
);
}

Server side(PHP): //query the db $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();

}
}
ベストアンサー

ポーリングクエリがデータベースロックを保持しているため、ポストクエリの実行が妨げられていますか?

あなたが眠っている前に、あなたの$結果を閉じた場合はどうなります:

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;
}

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です