Отправка неблокирующего запроса HTTP POST
У меня есть два сайта в php и python.
Когда пользователь отправляет запрос на сервер, мне нужен php/python для отправки запроса HTTP POST на удаленный сервер. Я хочу немедленно ответить пользователю, не дожидаясь ответа с удаленного сервера.
Можно ли продолжить запуск php/python script после отправки ответа пользователю. В этом случае я сначала отвечу пользователю и только затем отправлю запрос HTTP POST на удаленный сервер.
Возможно ли создать неблокирующий HTTP-клиент в php/python без обработки ответа вообще?
Решение, которое будет иметь ту же логику в php и python, предпочтительнее для меня.
Спасибо
Ответы
Ответ 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 предназначен для решения вашей проблемы.