13

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

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

是否可以在不处理响应的情况下在 php/python 中创建非阻塞 HTTP 客户端?

在 php 和 python 中具有相同逻辑的解决方案对我来说更可取。

谢谢

4

6 回答 6

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';    
?>
于 2009-10-12T16:55:03.737 回答
2

您可以生成另一个进程来处理对另一台服务器的 POST。在 PHP 中,您将生成进程并“断开连接”,因此您无需等待响应。

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

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

于 2009-10-12T16:41:14.887 回答
1

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

于 2009-10-12T16:35:50.750 回答
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);
于 2014-05-28T14:04:35.330 回答
0

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

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

Hookah旨在解决您的问题。

于 2009-10-12T16:57:46.290 回答