2010-12-16 6 views
5

클라이언트에게 일부 데이터를 "푸시"하기 위해 롱 폴링을하고 싶습니다. 또한 긴 폴링과 병행하여 서버와 무관 한 AJAX 호출을하고 있습니다. 긴 폴링이 응답을 받거나 (응답 또는 타임 아웃에서) 내 다른 AJAX 호출이 완료되지 않는 것으로 보입니다. Javascript를 단계별로 실행하면 적절한 시간에 두 번째 AJAX 요청이 전송 된 것처럼 보이지만 긴 폴링 요청이 응답을받을 때까지 응답이 수신되지 않습니다. 무슨 일이 일어나고 있는지 아십니까?다른 AJAX 호출을 잠그는 롱 폴링

서버 측 :

function getPlaylistTracksIfChanged($playlist_id, $numClientTracks) { 
    $reportChange = false; 
    for($i = 0; $i < 10; $i++) { 
    $numServerTracks = $this->PlaylistTrack->find('count', array(
    'conditions' => array('playlist_id' => $playlist_id) 
    ) 
    ); 

    if($numClientTracks != $numServerTracks) { 
    $reportChange = true; 
    break; 

    } 

    sleep(3); 

    } 

    if($reportChange) { 
    $playlist_tracks = $this->PlaylistTrack->find('all', array(
    'conditions' => array('playlist_id' => $playlist_id), 
    'order' => array('PlaylistTrack.position') 
    ) 
    ); 

    $this->set('playlist_tracks', $playlist_tracks); 
    $this->layout = false; 
    $this->render('show_playlist_tracks_list'); 

    } else { 
    $this->autoRender = false; 
    return 'false'; 
    } 

} 

클라이언트 측 :

function checkForChangesOnServer() { 
$.post('/getResultsIfChanged/' + playlist_id + '/' + $('#sortable_tracks').children().size(), function(results) { 

    if(results == 'false') { 
    //alert('no change'); 
    } else { 
    //alert('change'); 
    } 

    checkForPlaylistChangesOnServer(); 

}); 
} 

그리고 다른 AJAX 호의 샘플 :

여기

긴 폴링 부용 코드 서버 측 :

function getLibraryTracksStartingWithLetter($user_id, $letter) { 
    $results = $this->Track->find(
    'all', 
    array(
    'conditions' => array(
    'user_id' => $user_id, 
    'OR' => array(
     'Track.artist LIKE' => $letter . '%', 
     'Track.name LIKE' => $letter . '%' 
    ) 
    ), 
    'order' => array('case when Track.artist = "" then 1 else 0 end', 'Track.artist', 'Track.name') 
    ) 
); 

    $this->set('results', $results); 
    $this->layout = false; 
    $this->render('show_library_results_list'); 
} 

클라이언트 측 : 당신이 세션 파일 잠금을 경험처럼

function loadLibraryResultsForLetter(letter) { 
highlightLetterFilter(letter); 

$.post('/getLibraryTracksStartingWithLetter/' + user_id + '/' + letter, function(results) { 
    updateLibraryResults(results); 
}); 
} 

답변

13

보인다.

ajax 끝점의 시작 부분에서 세션을 닫으려면 session_write_close() (또는 cakephp의 해당 기능)을 수행하십시오.

+0

의 사용자 session_write_close(); 그것에 대해 멋진 물건 – RageZ

+1

@RageZ 몰랐 : 모든 PHP 개발자가 – zerkms

+0

메이크업 감각 :-)이 문제를 캐치 할 필요 지금 내가 근무 – RageZ

0

이는 세션 파일 잠금 때문에 발생합니다. CakePHP에서는 세션 관리를위한 다른 옵션을 선택할 수 있습니다. 데이터베이스, 캐시 등에서 세션을 저장할 수 있으므로 파일 잠금 문제를 기다리지 않아도됩니다.

내장 된 구성은 다음과 같습니다

PHP는 - php.ini 파일의 표준 설정으로 세션을 저장합니다.

케이크 - 세션을 app/tmp/sessions 안에 파일로 저장합니다. 호스트에서 자신의 집 디렉터리 외부에 쓸 수 없으면이 값은 옵션입니다.

데이터베이스 - 내장 데이터베이스 세션을 사용하십시오.

캐시 - 기본 제공 캐시 세션을 사용합니다. 물론

http://book.cakephp.org/2.0/en/development/sessions.html#built-in-session-handlers-configuration

당신은 session_write_close()을 할 수 있지만 변경은 두 페이지가로드 사이에 세션에서 필요 없는지 확인해야합니다.

비슷한 질문 : Simultaneous Requests to PHP Script

0

심포니 1.4 작동합니다. 대신 $this->getUser()->shutdown();

관련 문제