2010-12-16 13 views
5

çağırır. Diğer AJAX çağrılarımın uzun ankete yanıt alıncaya kadar (yanıt veya zaman aşımından) tamamlanmadığı anlaşılıyor. Javascript'i adım attığımda, 2. AJAX isteğinin doğru zamanda gönderildiği anlaşılıyor, ancak uzun yoklama isteği yanıt alıncaya kadar yanıt alınmıyor. Neler olup bittiği hakkında bir fikrin var mı?Uzun yoklama ben istemciye aşağı uzun yoklama için "itme" bazı veriler vermek istiyorum ve ben de diğer alakasız AJAX uzun yoklama paralel olarak sunucuya çağrıları yapıyorum

Sunucu tarafı::

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

} 

İstemci tarafı:

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

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

    checkForPlaylistChangesOnServer(); 

}); 
} 

Ve başka AJAX arama örnek:

İşte

uzun yoklama kısmı için koddur Sunucu tarafı:

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

İstemci tarafı: Eğer oturum dosya kilidini deneyimli gibi

function loadLibraryResultsForLetter(letter) { 
highlightLetterFilter(letter); 

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

cevap

13

görünüyor.

ajax son nokta başlayacak oturumu kapatmak için session_write_close() (CakePHP'de veya ilgili işlevi) gerçekleştirin.

+0

kullanıcı session_write_close(); bu konuda güzel şeyler – RageZ

+1

@RageZ bilmiyordum: Her php geliştirici – zerkms

+0

yapmak anlamda :-) bu sorunu yakalamak gerektiğini şimdi bunu çalıştı – RageZ

0

Bunun nedeni oturumun dosya kilitlerinin olur. CakePHP'de oturum yönetimi için diğer seçenekleri seçebilirsiniz. Oturumları veritabanına, önbelleğe vb. Kaydedebilirsiniz. Böylece dosya kilitleme sorunlarını beklemezsiniz.

yerleşik yapılandırmalarıdır:

php - php.ini dosyasındaki standart ayarlarla oturumları kaydeder.

kek - app/tmp/oturumları içindeki dosyaları olarak oturumları kaydeder. Bu, kendi ev dir dışına yazmaya izin vermez ana üzerinde iyi seçenek ne zaman olacağı.

veritabanı - Kullanım dahili veritabanı oturumları.

Önbellek - Yerleşik önbellek oturumlarını kullanın. Tabii

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

sen session_write_close() yapabilir, ancak hiçbir değişiklik iki sayfa yüklemeleri arasında oturumda gerekli olduğundan emin olmalıdır.

Benzer soru: Simultaneous Requests to PHP Script

0

o symfony 1.4 için çalışır. yerine $this->getUser()->shutdown();

İlgili konular