发送非阻塞HTTP POST请求

时间:2009-10-12 16:22:38

标签: php python nonblocking

我在php和python中有两个网站。 当用户向服务器发送请求时,我需要php / python将HTTP POST请求发送到远程服务器。我想立即回复用户而不等待远程服务器的响应。

是否可以在向用户发送响应后继续运行php / python脚本。在这种情况下,我将首先回复用户,然后将HTTP POST请求发送到远程服务器。

是否可以在php / python中创建非阻塞HTTP客户端而无需处理响应?

在php和python中具有相同逻辑的解决方案对我来说是优选的。

谢谢

6 个答案:

答案 0 :(得分:6)

在PHP中,您可以通过发送此请求来关闭连接(这与HTTP相关,也可以在python中使用,但我不知道要使用的正确语法):

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

附录:我忘了你可能要设置“Context-Length”。另外,请查看this comment以获取提示和真实测试用例。

实施例

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

答案 1 :(得分:2)

您可以生成另一个进程来处理对其他服务器的POST。在PHP中,您将生成进程并“断开连接”,这样您就不会等待响应。

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

然后你可以卷曲来执行帖子。如果要将参数传递给PHP脚本,可以使用getopt()函数来读取它们。不确定你是否会在Python中做类似的事情。

答案 2 :(得分:1)

您需要做的是让PHP脚本执行另一个执行服务器调用的脚本,然后向用户发送请求。

答案 3 :(得分:0)

你必须使用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);

答案 4 :(得分:0)

你必须设定一个中间人。因此,在您自己的服务器中,您将拥有:

  • 网络表单;
  • 提交处理程序(处理表单提交的php或python脚本);
    • 您的处理程序会创建一个新文件并用提交数据填充它。例如,您可以将数据格式化为JSON;
    • 因此,您的处理程序只有一个作业,将提交的数据保存在文件中并响应用户,没有别的。这应该很快。
  • 创建一个文件系统事件驱动的cron(不是时间驱动的cron)。请参阅thisthis个问题(分别针对Windows和ubuntu服务器)。
    • 设置您的cron以执行php或python脚本,然后将该数据重新发布到远程服务器。

答案 5 :(得分:-3)

Hookah旨在解决您的问题。