2011-02-11 43 views
5

Tôi đang thực hiện một phòng chat phương pháp thăm dò ý kiến ​​dài. Nhưng có vẻ như, khi một cuộc thăm dò dài xảy ra và tôi làm mới trang bằng chrome HOẶC tôi cố gửi một yêu cầu không đồng bộ khác mọi thứ ra ngoài (tức là tôi không thể tải lại tên miền của mình cho đến khi đóng/mở lại trình duyệt).Vấn đề thời gian chờ bỏ phiếu dài

Khách hàng của tôi đang bên là:

$(document).ready(function() { 
    setTimeout(
     function() { 
     longPollForMessages(); 
     }, 
     500 
    ); 
    }); 

function longPollForMessages() 
{ 
    $.ajax({ 
    url: url, 
    dataType: 'json', 
    success: function(data) {  
     $('#chat_messages').append('<div>'+data.messages+'</div>'); 

     longPollForMessages(); 
    } 
    }); 
} 

Và serverside tôi:

while(true) { 
     $messages = $db->getMessages(); 

     if (!$messages || sizeof($messages)==0) { 
     sleep(1); 
     } else { 
     echo '{"message":'.json_encode($messages).'}'; 
     die(); 
     } 
    } 

Bất kỳ ý tưởng? Giả sử không có lỗi cú pháp.

+0

Hãy thử đặt một 'ngắt;' sau khi 'echo' trong mã serverside –

+0

Cảm ơn bốn câu trả lời của bạn :) Tôi thực sự đã có nhưng quên bao gồm trong mã câu hỏi của tôi. Vì vậy, đó không phải là vấn đề. –

+2

Các bạn, tôi đã tìm ra từ câu hỏi này: http://stackoverflow.com/questions/4457178/long-polling-locking-up-other-ajax-calls - php khóa một phiên nhất định cho đến khi trang được tải xong để cuộc gọi ajax thứ hai không thể đi qua được. Bạn phải giải phóng khóa bằng cách gọi session_write_close(); –

Trả lời

0

Tôi đã tìm ra câu hỏi này: stackoverflow.com/questions/4457178/… - php khóa một phiên nhất định cho đến khi trang được tải xong để cuộc gọi ajax thứ hai không thể thực hiện được. Bạn phải giải phóng khóa bằng cách gọi session_write_close();

0

Tôi có thể thấy bạn đã trả lời câu hỏi của riêng bạn, nhưng gần đây tôi đã gặp sự cố tương tự và tìm cách khác để xử lý nó là tắt setTimeout khi gọi ajax, sau đó khởi động lại trên success. Bằng cách đó bạn không ping máy chủ của bạn để biết thông tin khi nó không sẵn sàng để cung cấp cho nó.

+0

AFAIK, setTimeout chỉ gọi hàm một lần. Vì vậy, bạn vẫn cần phải khởi động lại cuộc gọi sau khi yêu cầu thành công. Bạn có thể xây dựng thêm một chút về câu trả lời của bạn không? –

Các vấn đề liên quan