CakePHP не удастся обработать два Ajax-запроса одновременно? - PullRequest
3 голосов
/ 21 мая 2011

Я редактирую этот пост в третий раз, после дополнительных тестов и отладок я продолжаю узнавать о новых материалах. Вот моя ситуация:

У меня есть метод thinker, который требует времени для обработки. Из-за этого я решил позвонить через Ajax и показать индикатор пользователю. До этого момента - прекрасно работает.

Еще одна вещь, которую я пытаюсь сделать, - это показать пользователю прогресс «мышления», в процентах или просто тиках, что угодно.

Это не трудно сделать, потому что thinker имеет цикл, и на каждой итерации он сохраняет новые thoughts в базу данных.

Так что в основном - counter просто показывает количество «мыслей» (привязанных к конкретному идентификатору).

Проблема в том, что опция обратного вызова не вызывается.

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

Вот упрощенный код:

<span id="indicator" style="display: none;"><img src="/img/ajax-loader.gif" alt="" /></span>
<span id="progress"></span>
<span id="clicker" style="cursor: pointer;">Do it!</span>

<script type="text/javascript">
//<![CDATA[
Event.observe('clicker', 'click', function(event) {
  new Ajax.Request(
    '/examples/thinker/123', 
    {asynchronous:true, evalScripts:true, onComplete:function(request, json) {Element.hide('indicator');}, onLoading:function(request) {Element.show('indicator');}}
    );
  new Ajax.PeriodicalUpdater(
    'progress', 
    '/examples/counter/123', 
    {asynchronous:true, evalScripts:true, frequency: 2}
    );
  });
//]]>
</script>

EDIT:

Благодаря использованию консоли Firebug XHR мне удалось немного углубиться в это. Я на самом деле пошел с JQuery (просто для тестирования, но это не помогло).

Проблема в CakePHP, я думаю. Я имею в виду - когда я создал идентичный сценарий с базовым PHP, он работает одновременно. Когда я сделаю это с Cake, будет вызван counter, затем будет вызван thinker, и будет вызван counter каждые две секунды, но он ответит только после того, как thinker закончит думать.

Возможно ли, что Cake не удастся обработать второй запрос, пока первый не будет завершен?

С уважением, Пол

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Ну, как оказалось, проблема на самом деле с Cake. По умолчанию CakePHP сохраняет сессии в файле (по умолчанию от php.ini на самом деле). Это сводится к:

Один пользователь не может запустить два экземпляра CakePHP одновременно с опцией сохранения сессии по умолчанию.

Изменение:

Configure::write('Session.save', 'php');

до

Configure::write('Session.save', 'cache');

Кажется, чтобы сделать трюк.

0 голосов
/ 22 мая 2011

Я не думаю, что торт виноват. В конечном итоге это может быть ваш сервер, но это маловероятно. Тем не менее, ваш скрипт может иметь блокировку базы данных, которая препятствует его повторному чтению. Это кажется гораздо более вероятным для меня. Я не эксперт в этом, поэтому я только догадываюсь здесь, но я бы посмотрел на постоянное соединение и принудительно закрыл / открыл соединение между каждым циклом. Есть также кое-что, что нужно проверить с помощью транзакций, но, опять же, я никогда не сталкивался с подобными проблемами.

В любом случае, я бы попытался исключить каждый компонент отдельно для расследования.

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