2010-02-03 63 views
20

我在写一个简单的REST服务,它响应来自客户端的请求。全部用PHP。发送POST请求而不等待响应?

我担心的是,当我的服务器响应请求时,如果客户端发送回“ok”响应速度太慢,它最终可能会占用资源。

如何通过lib_curl发送POST请求,将其设置为不等待任何响应,而是在发送POST数据后马上退出?

这甚至可能吗?谢谢 !

+1

这不是发送200 OK响应的客户端,而是服务器。 客户端发出请求,服务器响应,服务器不关心客户端正在发生什么(按照REST的定义,它是无状态的)。你在想什么,你能否详细说明一下? – meouw 2010-02-03 09:28:08

回答

13

你不能只发送数据,而不会收到答案与HTTP。 HTTP总是发出请求 - >响应。即使答案很短(就像一个没有文字的简单的200),也需要做出回应。每个HTTP套接字都会等待这个响应。

如果你不关心响应,你可以添加一个进程到服务器,使你的请求,你只是你的请求数据给它(像在后台运行的服务,检查请求数据库,并且每当添加新条目时始终开始请求)。这样,您可以异步地发出请求,并在您将请求添加到堆栈后立即退出。

此外,正如ouw所说,客户端不是你使用php进行的任何通信的一部分。 Php是一种服务器端语言,所以当客户端请求一个网页(php文件)时,服务器执行该文件(并执行所有请求php文件状态),然后将结果返回给客户端。

+0

这就是我需要知道的:)谢谢 – Gotys 2010-02-03 09:53:54

+0

@Gotys旁注,如果你想发送一个“请求”而不等待回应,请查看UDP协议 – chris 2016-07-01 22:28:21

+0

有火和忘记“模式”。一个asyc请求会触发请求。一旦执行,你可以做其他事情而无需等待。在你有一个可靠的网络连接的情况下,UDP是一个选项,但TCP更可靠,因为你知道这些数据包会生成它。但是,如果不检查回复,您将不知道发生了什么。 – 2017-10-13 20:02:08

1

我从来没有尝试过这个,但将CURLOPT_TIMEOUT设置为非常低的值可能会诀窍。尝试00.1

但是,我不知道cURL和客户端如何处理这个问题,当连接已经建立时连接是否会被主动取消,并且达到了超时。你将不得不尝试。如果你打电话给PHP脚本,也许ignore_user_abort()可以确保你的脚本以任何一种方式运行。

+2

curl 0 timeout将让它运行更长时间 – Boy 2016-11-02 02:43:48

+0

如果您要尝试一个较低的超时,请使用毫秒变化curl_setopt($ curl,CURLOPT_TIMEOUT_MS,1); – 2017-10-17 19:57:27

12

这里:

ob_end_clean(); 
header("Connection: close\r\n"); 
header("Content-Encoding: none\r\n"); 
header("Content-Length: 1"); 
ignore_user_abort(true); 

和卷曲:

curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1); 
curl_setopt($curl, CURLOPT_NOSIGNAL, 1); 
+1

你能提供解释为什么这个工作 – 2016-10-06 10:36:14

+1

我发现了几个解决方案,其中包括输出缓冲区的一部分,但它仍然没有为我工作,直到我添加了这些卷曲选项。谢谢! – 2017-10-25 21:55:56

3

如果你真的不关心你可能最好关闭exec -ing一个wget命令的响应。这是在传递一些其他的答案中提到,但这里有一个超级简单的功能通过这种方式发送_POST包(这是异步的,需要1-2MS):

function wget_request($url, $post_array, $check_ssl=true) { 

    $cmd = "curl -X POST -H 'Content-Type: application/json'"; 
    $cmd.= " -d '" . json_encode($post_array) . "' '" . $url . "'"; 

    if (!$check_ssl){ 
    $cmd.= "' --insecure"; // this can speed things up, though it's not secure 
    } 
    $cmd .= " > /dev/null 2>&1 &"; //just dismiss the response 

    exec($cmd, $output, $exit); 
    return $exit == 0; 
} 

现金功能是改编自 https://segment.com/blog/how-to-make-async-requests-in-php/