发送非阻塞HTTP POST请求

14 投票
6 回答
12813 浏览
提问于 2025-04-15 15:01

我有两个网站,一个用PHP做,另一个用Python做。

当用户向服务器发送请求时,我需要PHP或Python向一个远程服务器发送一个HTTP POST请求。我希望能立刻回复用户,而不必等远程服务器的响应。

这样的话,能不能在给用户回复后继续运行PHP或Python脚本?也就是说,我先回复用户,然后再发送HTTP POST请求到远程服务器。

有没有办法在PHP或Python中创建一个非阻塞的HTTP客户端,完全不处理响应呢?

对我来说,最好是PHP和Python的解决方案逻辑是一样的。

谢谢!

6 个回答

1

你需要做的是让PHP脚本去执行另一个脚本,这个脚本负责与服务器进行通信,然后把请求的结果发送给用户。

2

你可以启动一个新的进程来处理发送到另一个服务器的POST请求。在PHP中,你可以启动这个进程并“断开连接”,这样就不用等着它的回应了。

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

然后你可以用curl来执行这个POST请求。如果你想把参数传给PHP脚本,可以使用getopt()这个函数来读取它们。不太确定在Python中是否有类似的做法。

6

在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';    
?>

撰写回答