AJAX возвращает данные до завершения выполнения - PullRequest
0 голосов
/ 14 января 2010

У меня есть страница, на которой я выполняю запрос AJAX. Цель этой страницы - вернуть заголовки письма, которое у меня работает нормально. Проблема в том, что это вызывается для каждого электронного письма в почтовом ящике. Это означает, что он будет вызываться один раз по почте в ящике. Причина в том, что проблема в том, что время выполнения функции imap_open составляет около секунды, поэтому каждый раз, когда она вызывается, выполняется. Есть ли способ сделать AJAX-вызов, который будет возвращать информацию в том виде, в котором она доступна, и продолжать выполнение, чтобы предотвратить множественные вызовы функции с медленным временем выполнения?

Ура, Gazler.

Ответы [ 4 ]

2 голосов
/ 14 января 2010

Существуют технологии, позволяющие вам сконфигурировать ваш сервер и Javascript, чтобы в сущности разрешить "обратный AJAX" (посмотрите на Google / Wikipedia "комета" или "обратный AJAX"). Тем не менее, это не невероятно просто, и для того, что вы делаете, вероятно, не стоит всей работы, которая уходит на его настройку.

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

Я не работаю в PHP, но если возможно сохранить возвращаемое значение imap_open или какие-либо побочные эффекты, возникающие в запросах, вам следует попытаться сделать это, а затем просто повторно использовать этот сохраненный ресурс.

Какой-то псевдокод:

if (!persisted_resource) {
    persisted_resource = imap_open()
}

persisted_resource.use()....

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

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

1 голос
/ 14 января 2010

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

В этом случае PHP-скрипт получит запрос диапазона, например

emailHeaders.php?start=25&end=50

Javascript будет поддерживать состояние и запрашивать данные порциями, пока все данные не будут загружены. Или вы можете сделать что-то необычное, например, создать политики на стороне клиента, когда запрашивать данные и какие данные запрашивать.

Браузер является еще одним узким местом, поскольку большинство браузеров допускают только 2 исходящих соединения в любой момент времени.

1 голос
/ 14 января 2010

Серверный PHP-скрипт может быть настроен на отправку вывода, как только он будет сгенерирован. В основном вам необходимо отключить все функции, которые могут вызвать буферизацию, например output_buffering , output_handler , сжатие HTTP, промежуточные прокси ...

Трудная часть в том, что вам нужно, чтобы ваша библиотека JavaScript могла обрабатывать частичные вводы. То есть: вам нужно иметь доступ к загруженным данным, как только они будут получены. Я считаю, что это технически возможно , но некоторые популярные библиотеки, такие как jQuery, позволяют читать данные только после завершения передачи.

1 голос
/ 14 января 2010

Звучит так, как будто вам нужно обработать столько электронных писем, сколько было получено с каждым звонком. В этот момент вы можете вернуть все данные вместе и проанализировать их на стороне клиента. Однако этот процесс не может продолжаться вечно, и сервер не может инициировать возврат дополнительных данных после ответа на запрос http, поэтому вам придется совершать последующие вызовы, чтобы обработать больше сообщений электронной почты позже.

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