Продолжить выполнение PHP после отправки ответа HTTP - PullRequest
60 голосов
/ 30 сентября 2010

Как я могу заставить PHP 5.2 (работающий как apache mod_php) отправить полный HTTP-ответ клиенту, а затем продолжать выполнение операций еще одну минуту?

Длинная история:

У меня есть PHP-скрипт, который должен выполнить несколько длинных запросов к базе данных и отправить электронную почту, для запуска которой требуется от 45 до 60 секунд,Этот скрипт вызывается приложением, которое я не могу контролировать.Мне нужно, чтобы приложение сообщало о любых сообщениях об ошибках, полученных из сценария PHP (в основном это неверные параметры).

Приложение имеет задержку тайм-аута менее 45 секунд (я не знаю точного значения) и, следовательно, регистрирует каждое выполнение сценария PHP как ошибку.Поэтому мне нужен PHP, чтобы посылать полный HTTP-ответ клиенту как можно быстрее (в идеале, как только входные параметры были проверены), а затем запустить базу данных и обработку электронной почты.

Я использую mod_php, поэтому pcntl_fork недоступен.Я мог бы обойти это, сохранив данные для обработки в базе данных и запустив фактический процесс с cron, но я ищу более короткое решение.

Ответы [ 13 ]

0 голосов
/ 01 октября 2010

Я бы порекомендовал порождать новый асинхронный запрос в конце, а не продолжать процесс с пользователем.

Вы можете порождать другой запрос, используя ответ здесь: Асинхронные вызовы PHP?

0 голосов
/ 30 сентября 2010

Вы можете разделить эти функции на три сценария.1. Инициируйте процесс и вызовите второй через exec или command, это также возможно запустить через http-вызов.2. второй запустит обработку базы данных и в конце запустит последний 3. последний отправит электронное письмо

0 голосов
/ 30 сентября 2010

Бах, я неправильно понял ваши требования.Похоже, что они на самом деле:

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

В этом случае, тогда да, использование внешней очереди заданий и / или cron будет работать,После проверки ввода вставьте сведения о задании в очередь и выйдите.Затем можно запустить другой сценарий, получить сведения о задании из очереди и запустить более длительный процесс.Алекс Ховански имеет правильную идею.

Извините, я признаю, что немного пробежался в первый раз.

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