Symfony: вызов ajax заставляет сервер ставить в очередь следующие запросы - PullRequest
1 голос
/ 26 февраля 2010

У меня проблема с моим приложением, когда ajax-вызов на сервере занимает слишком много времени: он ставит в очередь все остальные запросы от пользователя до тех пор, пока он не будет выполнен на стороне сервера (я понял, что отмена клиентской стороны вызова не имеет никакого эффекта и пользователь еще должен ждать).

Вот мой тестовый пример:

<script type="text/javascript" src="jquery-1.4.1.min.js"></script>

<a href="another-page.php">Go to another page on the same server</a>


<script type="text/javascript">
    url = 'http://localserver/some-very-long-complex-query';
    $.get(url);
</script>

Таким образом, когда вызывается get, а затем после того, как я нажимаю на ссылку, сервер завершает обслуживание первого вызова, прежде чем перенести меня на другую страницу. Моя проблема в том, что я хочу избежать такого поведения.

Я нахожусь на сервере LAMP и ищу способ сообщить серверу, что пользователь прервал запрос с помощью функции, такой как connection_aborted (), как вы думаете, это путь? Кроме того, я знаю, что самая длинная часть этого сценария PHP - это запрос MySQL, поэтому, даже если я знаю, что connection_aborted () может обнаружить, что пользователь отменил вызов, мне все равно нужно проверить это во время запроса MySQL ... I ' Я не совсем уверен, что PHP может обрабатывать такого рода "события".

Так что, если у вас есть идея получше, я не могу дождаться, чтобы ее услышать.

Спасибо.


Обновление: После дальнейших исследований я обнаружил, что проблема возникает только с фреймворком Symfony (который я опускал до точного, мой плохой). Кажется, что вызов Ajax блокирует любой другой будущий вызов. Это может быть связано с контроллером или системой маршрутизации, я смотрю на это.

Также для тех, кто заинтересован в проблеме, вот мой новый контрольный пример: -новый проект с Symfony 1.4.3, конфигурация по умолчанию, я только что создал приложение и модуль по умолчанию. -jquery 1.4 для ajax-запроса.

Вот мой файл actions.class.php (в моем уникальном модуле):

class defaultActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
    //Do nothing
  }

  public function executeNewpage()
  {
    //Do also nothing
  }

  public function executeWaitingaction(){
    // Wait
    sleep(30);
    return false;
  }

}

Вот мой файл шаблона indexSuccess.php:

<script type="text/javascript" src="jquery-1.4.1.min.js"></script>

<a href="<?php echo url_for('default/newpage');?>">Go to another symfony action</a>


<script type="text/javascript">
    url = '<?php echo url_for('default/waitingaction');?>';
    $.get(url);
</script>

Для нового шаблона страницы это не очень актуально ... Но с этим я могу воспроизвести проблему блокировки, с которой я столкнулся в моем реальном приложении.

У кого-то еще такая же проблема?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2010

Хорошо, я наконец понял, почему приложение ожидает: сессионная система PHP ставит в очередь другой запрос, пока сессия не будет закрыта. Так что моему вызову ajax не нужно использовать сеанс, я делаю $ this-> getUser () -> shutdown (), прежде чем мое действие займет слишком много времени.

Каждая деталь здесь: http://garethmccumskey.blogspot.com/2009/10/php-session-write-locking-and-how-to.html

0 голосов
/ 16 марта 2010

Здравствуйте, у меня та же проблема, с похожим скриптом.

Jquery скрипт

$.ajax({url :'/map/test1',  async:true ,complete: function(){alert("test1")}});
$.ajax({url :'/map/test2',  async:true ,complete: function(){alert("test2")}});

Symfony php

public function executeTest1()
{
 $this->getUser()->shutdown();
 usleep(10000000);
 return $this->renderText("Oki");
}

public function executeTest2()
{
 return $this->renderText("Oki");
}

Когда страница загружается, запрос test1 ожидает окончания сна (10000000), но test2 ожидает окончания выполнения test1.

Я решил эту проблему с Symfony.

0 голосов
/ 26 февраля 2010

Нужно ли прервать его на сервере или вы просто хотите, чтобы пользователь был перенаправлен немедленно?

Возможно, что-то вроде AJAXQueue подойдет для вас? (с очевидными необходимыми изменениями в вашем коде на стороне клиента ..)

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