2011-01-20 2 views
2

Я работаю с CakePHP в приложении, которое должно запускать трудоемкую задачу с помощью одного вызова AJAX, со вторичным периодическим AJAX-вызовом, проверяющим ход выполнения задачи.CakePHP Concurrent AJAX Запросы Блокировка

Проблема

Хотя трудоемкая задача (которая занимает> 30 секунд) работает через это AJAX запрос на CakePHP прогресс запрос на вторичном AJAX, похоже, не будет «блокировка».

Чтобы уточнить, запрос AJAX для вторичного хода не возвращает никакой ошибки, он просто не возвращает никакого ответа до тех пор, пока не закончится первоначальный запрос времени.

Как только этот оригинальный запрос AJAX завершается, вторичный запрос AJAX прогресса возвращается, как ожидалось.

Похоже, что выполнение запроса на выполнение ставится в очередь до тех пор, пока первый вызов AJAX не завершится, так как достигнутый прогресс равен 100%.

Что я Пробовал

Я попробовал несколько предложенных решений, в том числе:

  • не Изменение обработчика сеанса 'пирога' в core.php - не исправить
  • Установка Конфигурация уровня безопасности до «medium» в core.php - нет исправления
  • Отключение проверки агента пользователя в core.php - нет исправления
  • Тестирование mul несколько одновременных вызовов AJAX на простой PHP-скрипт на том же сервере - работает как ожидалось

Любые идеи?

Так кажется, что проблема вызвана CakePHP - кто-нибудь испытал это в своем собственном приложении CakePHP?

Спасибо!

ответ

0

Для некоторых пояснений вы используете встроенный помощник AJAX (на прототипе) или какую-то внешнюю библиотеку, например jQuery?

Как правило, библиотека javascript по выбору имеет {async: true}, доступный для принудительного параллелизма. Смотрите этот пример:

$.ajax({ 
    type: 'GET', 
    url: '/fetch.php', 
    async: true, 
    success: function(data, status) { 
     $('#status').html(status); 
    } 
}); 

Для встроенного в CakePHP помощника AJAX, этот вариант следует сделать трюк: $options['type']. Больше информации here. Обратите внимание, что помощник AJAX устарел с версии 1.3, и jsHelper должен иметь возможность захвата, например, request() метод here (также имеет опцию, называемую async).

+0

Привет, лавандер, я использую Prototype, но я не думаю, что проблема с JS-инфраструктурой. Мне удалось достичь одновременных вызовов AJAX через Prototype на сервере, отличном от CakePHP, поэтому похоже, что «блокировка» происходит где-то внутри CakePHP. – Ben

+0

Привет, я нашел проблему. Мое приложение CakePHP использовало сеансы на основе файлов, что означало, что к основным файлам CakePHP можно было получить доступ только по одному запросу в любой момент времени. Переключение на сеансы memcache решило это. – Ben

+0

Сеансы, блокирующие несколько запросов? Не видел, что придет :) Рад, что вы нашли проблему tho '. – laander

3

обработка Session установлен на файл в PHP

из php.ini

[Session] 
; Handler used to store/retrieve data. 
; http://php.net/session.save-handler 
session.save_handler = files 

Это предотвратить PHP запуск более одного экземпляра сеанса для каждого пользователя.

Чтобы предотвратить это запустить это в коде PHP:

session_write_close(); 

Просто знаю, сессия сейчас закрыта, поэтому запись на сессии уже не вариант.

Смежные вопросы