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