Мой сценарий вызывается сервером. С сервера я получу ID_OF_MESSAGE
и TEXT_OF_MESSAGE
.
В моем скрипте я обрабатываю входящий текст и генерирую ответ с параметрами: ANSWER_TO_ID
и RESPONSE_MESSAGE
.
Проблема в том, что я отправляю ответ на входящие сообщения "ID_OF_MESSAGE"
, но сервер, который отправляет мне сообщение для обработки, установит его сообщение как доставленное мне (это означает, что я могу отправить ему ответ на этот идентификатор) после получения ответа HTTP 200.
Одно из решений - сохранить сообщение в базе данных и создать cron, который будет запускаться каждую минуту, но мне нужно немедленно сгенерировать ответное сообщение.
Есть ли какое-то решение, как отправить на сервер HTTP-ответ 200, а затем продолжить выполнение php-скрипта?
Большое тебе спасибо
header("Content-Encoding: none")
fastcgi_finish_request()
в концеЯ видел здесь много ответов, в которых предлагается использовать,
ignore_user_abort(true);
но этот код не нужен. Все это гарантирует, что ваш скрипт продолжит выполнение до того, как будет отправлен ответ в случае, если пользователь прервет работу (закрыв свой браузер или нажав escape, чтобы остановить запрос). Но вы спрашиваете не об этом. Вы просите продолжить выполнение ПОСЛЕ отправки ответа. Все, что вам нужно, это следующее:Если вас беспокоит, что ваша фоновая работа займет больше времени, чем установленное по умолчанию ограничение по времени выполнения сценария PHP, тогда оставайтесь
set_time_limit(0);
наверху.источник
Если вы используете обработку FastCGI или PHP-FPM, вы можете:
Источник: https://www.php.net/manual/en/function.fastcgi-finish-request.php
Проблема PHP №68722: https://bugs.php.net/bug.php?id=68772
источник
Я потратил несколько часов на эту проблему, и у меня есть эта функция, которая работает на Apache и Nginx:
Вы можете вызвать эту функцию перед длительной обработкой.
источник
filter_input
функцией, она иногда возвращает NULL. увидеть этот вклад пользователей к деталямНемного изменил ответ @vcampitelli. Не думайте, что вам нужен
close
заголовок. Я видел повторяющиеся закрытые заголовки в Chrome.источник
Для этого я использую php-функцию register_shutdown_function.
http://php.net/manual/en/function.register-shutdown-function.php
Изменить : вышеуказанное не работает. Кажется, меня ввела в заблуждение какая-то старая документация. Поведение register_shutdown_function изменилось после PHP 4.1 ссылка ссылка
источник
Я не могу установить pthread, и ни одно из предыдущих решений у меня не работает. Я нашел только следующее решение для работы (ref: https://stackoverflow.com/a/14469376/1315873 ):
источник
в случае использования php file_get_contents закрытия соединения недостаточно. php все еще ждет отправки eof witch сервером.
мое решение - прочитать Content-Length:
вот образец:
response.php:
Обратите внимание на "\ n" в ответ на закрытие строки, если fget не читается во время ожидания eof.
read.php:
Как вы можете видеть, этот скрипт dosent ждет около eof, если длина контента достигнута.
надеюсь, это поможет
источник
Я задал этот вопрос Расмусу Лердорфу в апреле 2012 года, цитируя эти статьи:
Я предложил разработать новую встроенную функцию PHP, чтобы уведомить платформу о том, что дальнейший вывод (на стандартный вывод?) Генерироваться не будет (такая функция может позаботиться о закрытии соединения). Расмус Лердорф ответил:
Я понимаю его точку зрения и поддерживаю его мнение относительно некоторых сценариев приложений / загрузки! Однако в некоторых других сценариях решения от vcampitelli et al. Являются хорошими.
источник
У меня есть что-то, что может сжимать и отправлять ответ, а также выполнять другой PHP-код.
источник
Есть другой подход, и его стоит рассмотреть, если вы не хотите вмешиваться в заголовки ответов. Если вы запустите поток в другом процессе, вызываемая функция не будет ждать своего ответа и вернется в браузер с завершенным http-кодом. Вам нужно будет настроить pthread .
Как только мы выполним $ continue_processing-> start (), PHP не будет ждать результата возврата этого потока и, следовательно, насколько будет учитываться rest_endpoint. Сделано.
Некоторые ссылки в помощь с pthreads
Удачи.
источник
Я знаю, что это старый, но, возможно, полезный на данный момент.
С этим ответом я не поддерживаю актуальный вопрос, но как правильно решить эту проблему. Надеюсь, это поможет другим людям решить подобные проблемы.
Я бы предложил использовать RabbitMQ или аналогичные службы и запускать фоновую рабочую нагрузку с использованием рабочих экземпляров . Существует пакет amqplib для php, который выполняет всю работу по использованию RabbitMQ.
Плюсы:
Нег:
источник