отправка неблокирующего HTTP-запроса POST - PullRequest
13 голосов
/ 12 октября 2009

У меня есть два сайта на php и python. Когда пользователь отправляет запрос на сервер, мне нужен php / python для отправки HTTP POST-запроса на удаленный сервер. Я хочу немедленно ответить пользователю, не дожидаясь ответа от удаленного сервера.

Можно ли продолжить выполнение скрипта php / python после отправки ответа пользователю. В этом случае я сначала отвечу пользователю и только потом отправлю запрос HTTP POST на удаленный сервер.

Можно ли создать неблокирующий HTTP-клиент в php / python, не обрабатывая ответ вообще?

Для меня предпочтительнее решение с одинаковой логикой в ​​php и python.

Спасибо

Ответы [ 6 ]

6 голосов
/ 12 октября 2009

В PHP вы можете закрыть соединение, отправив этот запрос (это связано с HTTP и работает также в Python, хотя я не знаю правильный синтаксис для использования):

// Send the response to the client
header('Connection: Close');
// Do the background job: just don't output anything!

Приложение: я забыл упомянуть, что вам, вероятно, нужно установить «Context-Length». Кроме того, проверьте этот комментарий для советов и реального теста.

Пример:

<?php    
ob_end_clean();
header('Connection: close');

ob_start();

echo 'Your stuff goes here...';

header('Content-Length: ' . ob_get_length());

ob_end_flush();
flush();

// Now we are in background mode
sleep(10);
echo 'This text should not be visible';    
?>
2 голосов
/ 12 октября 2009

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

exec("nohup /path/to/script/post_content.php > /dev/null 2>&1 &");

Затем вы можете свернуться, чтобы выполнить сообщение. Если вы хотите передать параметры в скрипт PHP, вы можете использовать функцию getopt () для их чтения. Не уверен, что вы сделаете что-то подобное в Python.

1 голос
/ 12 октября 2009

Что вам нужно сделать, это заставить скрипт PHP выполнить другой скрипт, который выполняет вызов сервера, а затем отправляет пользователю запрос.

0 голосов
/ 04 марта 2018

Вы должны установить среднего человека. Таким образом, на вашем собственном сервере вы должны иметь:

  • веб-форма;
  • Обработчик отправки (скрипт php или python, который обрабатывает отправку формы);
    • Ваш обработчик создает новый файл и заполняет его данными отправки. Например, вы можете отформатировать данные в формате JSON;
    • Таким образом, ваш обработчик выполняет одно задание: сохраняйте отправленные данные в файл и отвечайте пользователю, больше ничего. Это должно быть быстро.
  • Создать cron, управляемый событиями файловой системы (не cron, управляемый временем). См. this и this вопросы (для серверов Windows и Ubuntu соответственно).
    • Настройте ваш cron на выполнение сценария php или python, который затем повторно отправит данные на удаленный сервер.
0 голосов
/ 28 мая 2014

Вы должны использовать fsockopen. И не слушайте результат

<?php

$fp = fsockopen('example.com', 80);

$vars = array(
    'hello' => 'world'
);
$content = http_build_query($vars);

fwrite($fp, "POST /reposter.php HTTP/1.1\r\n");
fwrite($fp, "Host: example.com\r\n");
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: ".strlen($content)."\r\n");
fwrite($fp, "Connection: close\r\n");
fwrite($fp, "\r\n");

fwrite($fp, $content);
0 голосов
/ 12 октября 2009

Кальян предназначен для решения вашей проблемы.

...