CakePHP Параллельная блокировка запросов AJAX - PullRequest
2 голосов
/ 20 января 2011

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

Проблема

Пока трудоемкая задача (которая занимает> 30 секунд) выполняется через свой AJAX-запрос к CakePHP, вторичный AJAX-запрос хода выполнения не может быть «блокирующим».

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

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

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

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

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

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

Есть идеи?

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Для обработки сеанса задан файл в 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();

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

0 голосов
/ 20 января 2011

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

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

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

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

...