У меня есть два веб-сайта в php и python. Когда пользователь отправляет запрос на сервер, мне нужен php / python для отправки запроса HTTP POST на удаленный сервер. Я хочу немедленно ответить пользователю, не дожидаясь ответа с удаленного сервера.
Возможно ли продолжить запуск сценария php / python после отправки ответа пользователю. В этом случае я сначала отвечу пользователю и только затем отправлю запрос HTTP POST на удаленный сервер.
Возможно ли создать неблокирующий HTTP-клиент в php / python без обработки ответа вообще?
Решение, которое будет иметь одну и ту же логику в php и python, предпочтительнее для меня.
благодаря
В 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'; ?>
Вы можете создать другой процесс для обработки POST на другом сервере. В PHP вы создадите процесс и «отключите», чтобы не дожидаться ответа.
exec("nohup /path/to/script/post_content.php > /dev/null 2>&1 &");
Затем вы можете завивать, чтобы выполнить пост. Если вы хотите передать параметры скрипту PHP, вы можете использовать функцию getopt () для их чтения. Не уверен, сделаете ли вы что-нибудь подобное в Python.
Вам нужно сделать, чтобы скрипт PHP выполнял другой скрипт, который вызывает сервер, а затем отправляет пользователю запрос.
в python вы можете просто закрыть выходной поток, а затем продолжить свой почтовый запрос
sys.stdout.close()
Вы должны использовать 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);
Кальян предназначен для решения вашей проблемы.