Отправка POST-запросов без ожидания ответа? - PullRequest
27 голосов
/ 03 февраля 2010

Я пишу простой сервис REST, который отвечает на запросы клиентов. Все в PHP.

Меня беспокоит то, что когда мой сервер отвечает на запрос, он может в конечном итоге связать ресурсы, если клиентская сторона слишком медленно отправляет ответ "ok".

Как мне отправить запрос POST через lib_curl, чтобы он не ожидал никаких ответов, а скорее немедленно завершал работу после отправки данных POST?

Это вообще возможно? Спасибо!

Ответы [ 6 ]

18 голосов
/ 03 февраля 2010

Вы не можете просто отправить данные, не получив ответа по HTTP. HTTP всегда идет запрос -> ответ. Даже если ответ очень короткий (например, простой 200 без текста), ответ должен быть. И каждый сокет HTTP будет ждать этого ответа.

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

Также, как сказал meouw, клиент не является частью какого-либо общения, которое вы делаете с php. Php - это серверный язык, поэтому, когда клиент запрашивает веб-страницу (файл php), server выполняет этот файл (и выполняет все запросы состояний файла php), а затем возвращает результат клиенту .

13 голосов
/ 05 июня 2012

Здесь:

ob_end_clean();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
header("Content-Length: 1");
ignore_user_abort(true);

и локон:

 curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1);
 curl_setopt($curl, CURLOPT_NOSIGNAL, 1);
8 голосов
/ 28 сентября 2016

Если вы действительно не заботитесь об ответе, вам, вероятно, лучше всего exec -ing команду wget.Это упомянуто в некоторых других ответах, но вот супер простая функция для отправки пакета _POST с помощью этого подхода (который асинхронный и занимает 1-2 мс):

function wget_request($url, $post_array, $check_ssl=true) {

  $cmd = "curl -X POST -H 'Content-Type: application/json'";
  $cmd.= " -d '" . json_encode($post_array) . "' '" . $url . "'";

  if (!$check_ssl){
    $cmd.= "'  --insecure"; // this can speed things up, though it's not secure
  }
  $cmd .= " > /dev/null 2>&1 &"; //just dismiss the response

  exec($cmd, $output, $exit);
  return $exit == 0;
}

Кредиты:Функция была адаптирована с https://segment.com/blog/how-to-make-async-requests-in-php/

2 голосов
/ 03 февраля 2010

http://curl.haxx.se/mail/lib-2002-05/0090.html

libcurl не имеет асинхронного интерфейса. Вы можете сделать это самостоятельно либо используя темы или используя неблокирующий «мультиинтерфейс», который libcurl предлагает. Читайте на мульти Интерфейс здесь:

http://curl.haxx.se/libcurl/c/libcurl-multi.html

PHP пример мультиинтерфейса находится здесь:

http://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/

1 голос
/ 03 февраля 2010

Я никогда не пробовал этого, но установка CURLOPT_TIMEOUT на очень низкое значение может помочь.Попробуйте 0 или 0.1.

Однако я не знаю, как cURL и клиент будут вести себя с этим, будет ли соединение активно отменено, когда соединение уже установлено, и время ожидания истекло.достиг.Вы должны попробовать.Если вы вызываете PHP-скрипты, возможно, ignore_user_abort() может обеспечить выполнение ваших скриптов в любом случае.

0 голосов
/ 17 июля 2014

Как говорят другие люди, когда вы отправляете http-запрос, вы должны ждать ответа.

В PHP вы можете сделать запрос, используя функцию exec.

Проверьте эту ссылку: Команда php exec (или аналогичная), чтобы не ждать результата

...