PHP отправить запрос POST в отдельном потоке и забыть

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

Я думал о том, как отправить сообщение партнеру, и мое решение было бы отправить запрос curl POST в любой из моих партнеров делает бронирование (кроме ответа на мой вопрос может у кого-то есть решение получше?).

У каждого партнера будет определенный URL, который они настроят для получения этого запроса POST и хранения информации о бронировании, которую мы им отправляем.

ПРОБЛЕМА: Если мы попытаемся отправить этот запрос, и их веб-сервер будет медленным или вниз, мы можем ждать излишне долго, чтобы получить ответ, который, в свою очередь, задержит подтверждение бронирования фактического пользователя, использующего наш услуга.

ИДЕАЛЬНОЕ РЕШЕНИЕ: Я хотел бы отправить этот запрос PHP cURL в другой поток, чтобы мы могли продолжить наш веселый путь и подтвердить бронирование. Если в другом потоке есть задержка, это нас не задержит.

другие решения, которые я рассмотрел:

  • вызов внешнего скрипта (например, написанного на python) для отправки этого запроса. Я читал это, используя exec () может быть очень ресурсоемким. У нас много заказы, поэтому мы будем отправлять много этих сообщений бронирования. Поэтому в идеале нам нужно что-то ресурсное.
  • С помощью сокетов. Я не знаком с конфигурацией этих, и я беспокоюсь о том, что наш сервер сокетов не работает. Это также похоже на миссию по поддержанию. Может, я ошибаюсь?
  • использование службы, как толкатель что фактически является услугой сокета. Недостатком является то, что если слушатель пропустит сообщение, они никогда не получат его снова. Е. Г. партнеру будет не хватать хранение, что бронирование.

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

2 ответов


таким образом, вы создаете API в PHP, который потребляют другие клиенты. вот что я бы предложил:

  1. пусть ваши клиенты делают запросы к вам, с помощью метода POST/GET; вместо вас, как сервер API, пытающийся передать данные вашим клиентам. это намного лучший подход, потому что он освобождает вас от сервера клиента, медленного или чего-то еще. Поэтому, когда они отправляют вам запрос, это означает, что они полностью способны обрабатывать ответ.

  2. использовать HTTP постоянное соединение: в apache его называют keep-alive установите значение high, чтобы клиенты могли повторно использовать существующее соединение и, таким образом, уменьшить задержку.

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

  4. реализовать фоновое задание на основе que на редис или что-то подобное. идея заключается в том, что все длительные задания сбрасываются в фоновое задание que, а затем для каждой задачи создается работник, поэтому эти задания выполняются с помощью многопроцессорной обработки. PHP рабочие с Redis & Solo

надеюсь, что это помогает


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

для более своевременной обработки вы можете создать демон, который проверяет очередь для обработки записей с меньшей задержкой, чем это возможно с cron. Груша имеет пакет System_Daemon это может помочь в создании демона в PHP.