2011-11-13 2 views
0

채팅 앱을 코딩했습니다. 모든 것이 잘 작동합니다. 하지만 지연된 응답이 있습니다.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 

}} 
); 
} 

서버 측 (PHP) : // DB를 쿼리를 $ 결과 = $ mysqli-> 쿼리 ($의 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... 
      } 

문제는 내가 메시지를 보낼 때, 그것은 폴링을 통해 (새로운 MSG를 함께)을 받기 위해 약 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(); 

} 
} 
+0

당신이하십시오 jqpost.php 줄 수 있습니까? 아마 그 문제가 거기에서 오는 것입니다. – fflorent

+0

그래 .. 내 첫 번째 게시물을 편집하고 그 코드도 추가했습니다 :) –

+0

나는 이것을 오해하고 있을지 모르지만 지연이있는 이유를 묻고 있습니까? 그렇다면 의도적으로 usleep() 호출을 PHP에 넣고 있습니까? 또한 원래 게시물의 $ sql은 무엇입니까? 데이터베이스 호출 속도가 느립니다. $ SQL 쿼리가 얼마나 느린 지 시간을 잰 적이 있습니까? –

답변

0

설문 조사 쿼리가 실행에서 포스트 쿼리를 방지, 데이터베이스 잠금을 들고 있습니까?

당신이 수면 전에 $ 결과를 닫으면 어떻게됩니까 :

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

고마워요 ...하지만 그다지 효과가 없습니다 :( –

관련 문제