отправить два запроса ajax одновременно в Symfony - PullRequest
0 голосов
/ 14 марта 2012

Когда я отправляю два ajax-запроса вместе, используя JQuery .. ответ объединяется

, например

$.ajax
({
    type: "POST",
    url: 'ajax.php'
});
$.ajax
({
    type: "POST",
    url: 'ajax2.php'
});

ajax.php, ajax2.php - два файла, содержащие фиктивный цикл forзаймет около 5 секунд.

Экран FireBug

POST localhost / ajax.php 200 ОК 4.77 с
POST localhost / ajax.php 200 ОК 4.37 с

Здесь каждыйвыполнение запроса занимает около 5 секунд .....

Когда я делаю тот же пример в Symfony, я получаю другой результат

$.ajax
({
    type: "POST",
    url: 'module/action1'
});
$.ajax
({
    type: "POST",
    url: 'module/action2'
});

action1, action2 - это два действия, которые просто содержат пустышкуцикл занимает около 5 секунд.

Экран FireBug

POST localhost / web / frontend_dev.php / module / action1 200 OK 4.47s

POST localhost / web / frontend_dev.php / module / action2 200 OK 9.87s

Обратите внимание, что второй запрос, выполненный после завершения первого, я не знаю, почему это произошло

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Когда приходит запрос, и он пытается начать сеанс, php проверит, используется ли тот же сеанс в данный момент. Если это так, новый запрос должен ждать, пока другой запрос не завершится, или не снимет блокировку сеанса.

Ваш случай следующий:

  • приходит первый запрос, блокировка сеанса
  • прибывает второй reauest, пытается заблокировать сеанс, должен ждать
  • [5 секунд сна]
  • первый запрос завершается, освобождает блокировку
  • второй запрос запускается, достигает блокировки сеанса
  • [5 секунд сна]
  • второй запрос заканчивается

По умолчанию symfony запускает сессию в начале каждого запроса.

В чистом PHP вы можете снять блокировку файла сеанса с помощью session_write_close(). Symfony имеет класс sfUser, который оборачивает функциональность сессии, вам нужно вызвать его shutdown() метод.

Имейте в виду, что если вы позже измените какие-либо данные сеанса в этом запросе, они не будут сохранены.

Для более подробного объяснения, прочитайте Блокировка записи PHP-сессии и как с ней бороться в symfony .

0 голосов
/ 14 марта 2012

Возможно, symfony что-то делает с ajax-запросами. Что произойдет, если вы попытаетесь:

$.ajax
({
    type: "POST",
    url: 'module/action1',
    async: true
});
$.ajax
({
    type: "POST",
    url: 'module/action2',
    async: true
});

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