发送开机自检请求而不等待响应?

2022-08-30 14:35:32

我正在编写一个简单的 REST 服务,它响应来自客户端的请求。全部在 PHP 中。

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

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

这有可能吗?谢谢!


答案 1

您不能只发送数据而不使用HTTP接收答案。HTTP 总是去请求 -> 响应。即使响应非常短(例如没有文本的简单200),也需要有响应。每个HTTP套接字都将等待该响应。

如果您不关心响应,则可以向发出请求的服务器添加一个进程,然后只需将请求数据推送到该服务器(例如,在后台运行的服务,检查请求数据库,并在添加新条目时始终启动请求)。这样,您就可以异步发出请求,并且可以在将该请求添加到堆栈后立即退出。

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


答案 2

此解决方案适用于软件最小接收包以继续编写脚本。如果你想不关心响应并有权访问exec,而不是在后台使用exec和调用脚本。第一个接收文件:

接收.php

ignore_user_abort(true); //continue script if connetions become close by webbrowser(client) within working script

ob_end_clean(); // this 4 lines just extra sending to web about close connect it just in case
header("Connection: close\r\n"); //send to website close connect 
header("Content-Encoding: none\r\n"); 
header("Content-Length: 1"); //

fastcgi_finish_request(); //close nginx,apache connect to php-fpm (php working but nginx or apache stop communication with php)
//continue scripting 
// ...DO HERE WHAT YOU WANT ...
//check test with your mongo or mysql to sure php still keep connection with db

前端通过PHP请求HTTP:这个解决方案比后台更好,你只需要等待1ms

发件人.php:

 curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1); //HERE MAGIC (We wait only 1ms on connection) Script waiting but (processing of send package to $curl is continue up to successful) so after 1ms we continue scripting and in background php continue already package to destiny. This is like apple on tree, we cut and go, but apple still fallow to destiny but we don't care what happened when fall down :) 
 curl_setopt($curl, CURLOPT_NOSIGNAL, 1); // i'dont know just it works together read manual ;)

--------- 检查完整解决方案------------的下一个答案

背景 服务器对HTTP的请求:这将在后台执行$cmd(没有cmd窗口),而无需PHP等待它完成,无论是在Windows上还是在Unix上。@source https://www.php.net/manual/en/function.exec.php

<?php
function execInBackground($cmd) {
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r")); 
    }
    else {
        exec($cmd . " > /dev/null &");  
    }
}
?>

推荐