Продолжить выполнение PHP после отправки ответа HTTP
====================================================

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

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

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

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

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

 который обрабатывает начальный запрос, создаст запись в очереди обработки, а затем немедленно вернется. Затем создайте отдельный процесс (возможно, через cron), который регулярно запускает все ожидающие задания в очереди.



 браузер). Секрет создания фонового HTTP-запроса заключается в том, чтобы установить очень маленький тайм-аут, поэтому ответ игнорируется.

Это рабочая функция, которую я использовал для этой цели:

31 мая. PHP асинхронный фоновый запрос Еще один способ создания асинхронного запроса в PHP (имитация фонового режима).

Для получения дополнительной информации вы можете посмотреть на<http://www.phpepe.com/2011/05/php-asynchronous-background-request.html>



 exec или cron было бы излишним для этой простой задачи. Нет причин не оставаться в одном сценарии. Это сочетание отлично сработало для меня:

читать больше в:[Как продолжить процесс после ответа на ajax-запрос в PHP?](https://stackoverflow.com/questions/1481247/how-to-continue-process-after-responding-to-ajax-request-in-php)



 а не продолжать процесс с пользователем.

Вы можете создать другой запрос, используя ответ здесь:[Асинхронные вызовы PHP?](https://stackoverflow.com/questions/124462/asynchronous-php-calls/2924987#2924987)



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

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



 но он потерялся (облака тогда не были обычным явлением), поэтому я искал его и придумал этот вопрос, удивленный тем, что он отсутствует, я искал больше и пришел вернуться сюда, чтобы опубликовать это:

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



т ваш основной файл:

И это ваш файл процессора:

Как вы можете видеть, верхний сценарий отключится через короткое время (в данном случае 10 миллисекунд). Возможно, что`CURLOPT_TIMEOUT_MS` не будет работать так, в этом случае это будет эквивалентно`curl_setopt($ch, CURLOPT_TIMEOUT, 1)`.

Поэтому, когда к процессорному файлу обращаются, он выполняет свои задачи независимо от того, прерывает ли пользователь (то есть вызывающий файл) соединение.

Конечно, вы также можете передавать параметры GET или POST между страницами.



[регистр-функция выключения](https://php.net/manual/en/function.register-shutdown-function.php) что-то исполнитпосле скрипт завершил диалог с браузером.

Смотрите также[ignore\_user\_abort](https://php.net/manual/en/features.connection-handling.php) - но вам не нужна эта функция, если вы используете функцию register\_shutdown\_function. На той же странице,`set_time_limit(0)` помешает вашему сценарию тайм-аут.



и вызовите второй через exec или`command`Это также можно запустить через HTTP-вызов. 2. второй запустит обработку базы данных и в конце запустит последний 3. последний отправит электронное письмо



В твоем апаче`php.ini` файл конфигурации, убедитесь, что буферизация вывода отключена:



 как если бы он был запущен в командной строке? Вы можете сделать это с помощью PHP[Exec](https://php.net/manual/en/function.exec.php).



имею в виду что-то вроде этого:

Теперь дочерний скрипт:

Основная идея:

родительский скрипт, вызываемый по запросу пользователя;parent вызывает дочерний скрипт (такой же, как parent или другой) на том же сервере (или любом другом сервере) и передает им данные запроса;родитель говорит, что хорошо для пользователя и заканчивается;ребенок работает.Если вам нужно взаимодействовать с дочерним процессом - вы можете использовать БД в качестве «коммуникационной среды»: родительский объект может читать дочерний статус и записывать команды, дочерний элемент может читать команды и записывать статус. Если вам это нужно для нескольких дочерних сценариев - вы должны хранить дочерний идентификатор на стороне пользователя, чтобы различать их, и отправлять этот идентификатор родителю каждый раз, когда вы хотите проверить статус соответствующего дочернего элемента.

Я нашел это здесь -<http://linuxportal.ru/forums/index.php/t/22951/>