我在写一个简单的REST服务,它响应来自客户端的请求。全部用PHP。发送POST请求而不等待响应?
我担心的是,当我的服务器响应请求时,如果客户端发送回“ok”响应速度太慢,它最终可能会占用资源。
如何通过lib_curl发送POST请求,将其设置为不等待任何响应,而是在发送POST数据后马上退出?
这甚至可能吗?谢谢 !
我在写一个简单的REST服务,它响应来自客户端的请求。全部用PHP。发送POST请求而不等待响应?
我担心的是,当我的服务器响应请求时,如果客户端发送回“ok”响应速度太慢,它最终可能会占用资源。
如何通过lib_curl发送POST请求,将其设置为不等待任何响应,而是在发送POST数据后马上退出?
这甚至可能吗?谢谢 !
你不能只发送数据,而不会收到答案与HTTP。 HTTP总是发出请求 - >响应。即使答案很短(就像一个没有文字的简单的200),也需要做出回应。每个HTTP套接字都会等待这个响应。
如果你不关心响应,你可以添加一个进程到服务器,使你的请求,你只是推你的请求数据给它(像在后台运行的服务,检查请求数据库,并且每当添加新条目时始终开始请求)。这样,您可以异步地发出请求,并在您将请求添加到堆栈后立即退出。
此外,正如ouw所说,客户端不是你使用php进行的任何通信的一部分。 Php是一种服务器端语言,所以当客户端请求一个网页(php文件)时,服务器执行该文件(并执行所有请求php文件状态),然后将结果返回给客户端。
我从来没有尝试过这个,但将CURLOPT_TIMEOUT
设置为非常低的值可能会诀窍。尝试0
或0.1
。
但是,我不知道cURL和客户端如何处理这个问题,当连接已经建立时连接是否会被主动取消,并且达到了超时。你将不得不尝试。如果你打电话给PHP脚本,也许ignore_user_abort()
可以确保你的脚本以任何一种方式运行。
curl 0 timeout将让它运行更长时间 – Boy 2016-11-02 02:43:48
如果您要尝试一个较低的超时,请使用毫秒变化curl_setopt($ curl,CURLOPT_TIMEOUT_MS,1); – 2017-10-17 19:57:27
http://curl.haxx.se/mail/lib-2002-05/0090.html
的libcurl没有异步接口。 您可以使用 使用线程或使用 libcurl提供的非阻塞“多接口”来完成此任务。阅读了多 接口在这里:多接口的
http://curl.haxx.se/libcurl/c/libcurl-multi.html
PHP例子是在这里:
http://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/
这里:
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);
你能提供解释为什么这个工作 – 2016-10-06 10:36:14
我发现了几个解决方案,其中包括输出缓冲区的一部分,但它仍然没有为我工作,直到我添加了这些卷曲选项。谢谢! – 2017-10-25 21:55:56
至于其他人说,当你做你必须等待响应HTTP请求。
在PHP中,您可以使用exec函数来执行请求。
如果你真的不关心你可能最好关闭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/
这不是发送200 OK响应的客户端,而是服务器。 客户端发出请求,服务器响应,服务器不关心客户端正在发生什么(按照REST的定义,它是无状态的)。你在想什么,你能否详细说明一下? – meouw 2010-02-03 09:28:08