Подтвердить что ты не робот

Отправка неблокирующего запроса HTTP POST

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

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

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

Решение, которое будет иметь ту же логику в php и python, предпочтительнее для меня.

Спасибо

4b9b3361

Ответ 1

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

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

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

Пример:

<?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

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

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

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

Ответ 3

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

Ответ 4

в python вы можете просто закрыть выходной поток, а затем продолжить свой почтовый запрос

sys.stdout.close()

Ответ 5

Вы должны использовать 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);

Ответ 6

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