Длинный опрос блокирует другие AJAX звонки - PullRequest
5 голосов
/ 16 декабря 2010

Я собираюсь сделать длинный опрос, чтобы «протолкнуть» некоторые данные клиенту, а также параллельно с долгим опросом я делаю другие несвязанные вызовы AJAX на сервер.Похоже, что другие мои вызовы AJAX не будут завершены, пока длинный опрос не получит ответ (либо из ответа, либо по таймауту).Когда я перехожу через Javascript, кажется, что 2-й 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);
 });
}

Ответы [ 3 ]

13 голосов
/ 16 декабря 2010

Похоже, вы испытали блокировку файла сеанса.

Выполните session_write_close() (или соответствующую функцию в cakephp), чтобы закрыть сеанс в начале конечной точки ajax.

0 голосов
/ 23 марта 2015

работает для symfony 1.4 .пользователь session_write_close(); вместо $this->getUser()->shutdown();

0 голосов
/ 03 апреля 2014

Это происходит из-за блокировки файла сеанса.В CakePHP вы можете выбрать другие опции для управления сессиями.Вы можете сохранять сеансы в базе данных, в кэше и т. Д. Таким образом, вы не ждете проблем с блокировкой файлов.

Встроенные конфигурации:

php - Сохраняет сеансы с помощьюстандартные настройки в вашем файле php.ini.

cake - Сохраняет сессии в виде файлов внутри app / tmp / session.Это хороший вариант, когда на хостах, которые не позволяют вам писать вне вашего собственного домашнего каталога.

database - использовать встроенные сеансы базы данных.

cache - использовать встроенныйв сеансах кэша.

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

Конечно, вы можете сделать session_write_close(), но вы должны быть уверены, что в сеансе не требуется никаких изменений между двумя загрузками страниц.

Аналогичный вопрос: Одновременные запросы к PHP Script

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...