Я хочу сделать длинный опрос, чтобы «подтолкнуть» некоторые данные к клиенту, и я также делаю другие несвязанные вызовы AJAX на сервере параллельно с длинным опросом. Похоже, что мои другие вызовы AJAX не будут завершены до тех пор, пока длительный опрос не получит ответ (либо от ответа, либо от таймаута). Когда я перехожу через Javascript, кажется, что второй запрос 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); }); }
Похоже, вы испытали блокировку файла сеанса.
Выполните session_write_close()
(или соответствующую функцию в cakephp), чтобы закрыть сеанс в начале конечной точки ajax.
Это происходит из-за блокировки файлов сеанса. В CakePHP вы можете выбрать другие варианты управления сеансом. Вы можете сохранять сеансы в базе данных, в кеше и т. Д. Поэтому вы не ждете проблем с блокировкой файлов.
Встроенные конфигурации:
php – Сохраняет сеансы со стандартными настройками в файле php.ini.
cake – сохраняет сеансы как файлы внутри приложения / tmp / сеансы. Это хороший вариант, когда на хостах, которые не позволяют писать за пределами собственного домашнего каталога.
database – использовать встроенные сеансы базы данных.
cache – использовать встроенные сеансы кеша.
http://book.cakephp.org/2.0/en/development/sessions.html#built-in-session-handlers-configuration
Конечно, вы можете сделать session_write_close()
, но вы должны быть уверены, что никаких изменений в сеансе между двумя загрузками страниц не требуется.
Аналогичный вопрос: одновременные запросы к скрипту PHP
он работает для symfony 1.4 . user session_write_close();
вместо $this->getUser()->shutdown();