Вы можете сделать это с AJAX, но вы можете получить лучшие результаты в реальном времени с реализацией, подобной COMET. Я считаю, что реализации COMET специально разработаны, чтобы обойти некоторые ограничения по таймауту, но я не использовал их, поэтому не могу предложить прямое руководство.
В любом случае я рекомендую передать работу другому процессу, как только он попадет на сервер.
Я разработал несколько различных решений для пакетных задач такого рода, и мне больше всего нравится передавать пакетную работу другому процессу. В такой системе страница загрузки передает работу на отдельный процессор и сразу же возвращается с инструкциями для пользователя, чтобы контролировать процесс.
Пакетный процессор может быть реализован несколькими способами:
- Разветвите и отсоедините дочерний элемент от ввода-вывода, чтобы завершить пакетную обработку. Родитель завершает веб-запрос.
- Сохраните загружаемый контент в очередь обработки (например, файл в файловой системе, записи в базе данных) и попросите веб-сервер уведомить внешнего процессора - либо пользовательского демона, либо готового планировщика, например, «at» для * nix систем.
Затем вы можете предложить пользователю несколько способов мониторинга процесса:
- Страница подтверждения загрузки содержит синхронный текущий мониторинг процесса пакетной обработки (через COMET или Flash). После завершения страницы подтверждения можно направить пользователя к их загрузке.
- Как и выше, но монитор не работает, но вместо этого использует периодический опрос с помощью AJAX или мета-обновления страницы
- Страница монитора очередей, которая показывает состояние всех выполняемых ими пакетных процессов.
Пакетный процессор может сообщить о своем состоянии несколькими способами:
- Обновление записи в базе данных
- Создание журнала обработки
- Использовать именованную трубу
Передача кода другому процессу имеет ряд преимуществ:
- Процесс будет продолжаться, когда пользователь случайно остановит браузер.
- Использование внешнего процесса вынуждает вас сообщать о состоянии партии таким образом, чтобы вы могли отсоединить монитор и заново подключить его в любое время. Например: КОГДА пользователь случайно уходит со страницы до завершения процесса.
- Реализовать пакетное регулирование и отсрочку проще, если вы решите, что вам нужно распределить пакетную обработку, чтобы она выполнялась в часы с низким трафиком.
- Вам не нужно беспокоиться о таймаутах в сети (на стороне клиента или на стороне сервера).
- Вы можете перезапустить веб-сервер, не беспокоясь о том, прерываете ли вы пакетный процесс.