2011-02-11 24 views
5

Robię długi chat room z metodą ankiety. Wydaje się jednak, że po długiej ankiecie odświeżam stronę w chrome LUB próbuję wysłać inne żądanie asynchroniczne, gdy przekroczono limit czasu (tzn. Nie mogę załadować mojej domeny ponownie, dopóki nie zamknę/ponownie otworzę przeglądarki).Wydłużenie limitu czasu odpytywania

Moja klient kod stronie jest:

$(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(); 
    } 
    }); 
} 

A moja ServerSide:

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

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

Jakieś pomysły? Nie przyjmuj błędów składniowych.

+0

Spróbuj wstawić 'break;' po 'echo' w kodzie servera –

+0

Dziękuję za odpowiedź:) Tak naprawdę miałem to, ale zapomniałem podać w moim kodzie pytającym. Więc to nie jest problem. –

+2

Faceci, zrozumiałem to z tego pytania: http://stackoverflow.com/questions/4457178/long-polling-locking-up-other-ajax-calls - php blokuje daną sesję, dopóki strona nie zostanie załadowana, więc drugie wywołanie ajax nie mogło przejść. Musisz zwolnić blokadę, wywołując session_write_close(); –

Odpowiedz

0

Znalazłem to z tego pytania: stackoverflow.com/questions/4457178/... - php blokuje daną sesję, dopóki strona nie zostanie załadowana, więc drugie wywołanie ajax nie było w stanie przejść. Musisz zwolnić blokadę, wywołując session_write_close();

0

Widzę, że już odpowiedziałeś na własne pytanie, ale ostatnio miałem podobny problem i znalazłem inny sposób, aby go obsłużyć, to wyłączyć setTimeout na wywołanie ajax, a następnie uruchom go ponownie na success. W ten sposób nie będziesz pingować serwera w poszukiwaniu informacji, gdy nie jest on gotowy do wydania.

+0

AFAIK, funkcja setTimeout wywołuje funkcję tylko raz. Musisz więc ponownie uruchomić połączenie po pomyślnym żądaniu. Czy możesz rozwinąć nieco więcej o swojej odpowiedzi? –