我正在编写一个简单的REST服务,它响应来自客户端的请求.全部用PHP.
我担心的是,当我的服务器响应请求时,如果客户端发送回"ok"响应太慢,它最终可能会占用资源.
如何通过lib_curl发送POST请求,将其设置为不等待任何响应,而是在POST数据发送后立即退出?
这甚至可能吗?谢谢 !
pok*_*oke 18
您不能在没有收到HTTP回答的情况下发送数据.HTTP总是请求 - >响应.即使响应非常短(如简单的200没有文本),也需要有响应.每个HTTP套接字都会等待该响应.
如果您不关心响应,可以向发出请求的服务器添加一个进程,然后将请求数据推送到它(就像在后台运行的服务,检查请求数据库,并且始终每当添加新条目时启动请求).这样,您可以异步地发出请求,并且可以在将该请求添加到堆栈后立即退出.
另外正如meouw所说,客户端不是你正在用php做的任何通信的一部分.Php是一种服务器端语言,因此当客户端请求网页(php文件)时,服务器执行该文件(并且所有请求php文件的状态),然后将结果返回给客户端.
Kam*_*ski 13
这里:
ob_end_clean();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
header("Content-Length: 1");
ignore_user_abort(true);
Run Code Online (Sandbox Code Playgroud)
和卷曲:
curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1);
curl_setopt($curl, CURLOPT_NOSIGNAL, 1);
Run Code Online (Sandbox Code Playgroud)
如果你真的不关心响应,你可能最好关闭exec一个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;
}
Run Code Online (Sandbox Code Playgroud)
致谢:功能改编自 https://segment.com/blog/how-to-make-async-requests-in-php/