Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending POST Requests without waiting for response?

Tags:

php

libcurl

I am writing a simple REST service, which responds to requests from clients. All in PHP.

My concern is, that when my server responds to a request, it could end up tying up resources if the client side is too slow in sending back "ok" response.

How do I send a POST request via lib_curl setting it to not wait for any responses, but rather quit immidiately after the POST data have been sent?

Is this even possible? Thank you !

like image 695
Gotys Avatar asked Feb 03 '10 09:02

Gotys


People also ask

How do I send a POST request without waiting for response?

You cannot just send data without receiving an answer with HTTP. HTTP always goes request -> response. Even if the response is just very short (like a simple 200 with no text), there needs to be a response. And every HTTP socket will wait for that response.

Does a Post request have a response?

A POST request requires a body in which you define the data of the entity to be created. A successful POST request would be a 200 response code.


2 Answers

You cannot just send data without receiving an answer with HTTP. HTTP always goes request -> response. Even if the response is just very short (like a simple 200 with no text), there needs to be a response. And every HTTP socket will wait for that response.

If you don't care about the response, you could add a process to the server that makes your requests, and you just push your request data to it (like a service that is running in the background, checking a request database, and always starting the request whenever a new entry was added). That way you would make the request asynchronously and could quit as soon as you added that request to the stack.

Also as meouw said, the client is not part of any communication you are doing with php. Php is a server-side language, so when the client requests a webpage (the php file), the server executes that file (and does all requests the php file states) and then returns the result to the client.

like image 134
poke Avatar answered Sep 19 '22 16:09

poke


This solutions is for software minimal recevied package to continue script. If you want don't care about respond and have access to exec than use exec and call script in background. First Recevier File:

recevier.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 

FRONTGROUND by PHP request to HTTP: this solution is better than background and you need wait only 1ms

sender.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 ;) 

--------- Check next answer to complete solution ------------

BACKGROUND By Server Request to HTTP: This will execute $cmd in the background (no cmd window) without PHP waiting for it to finish, on both Windows and 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 &");       } } ?> 
like image 39
Kamil Dąbrowski Avatar answered Sep 22 '22 16:09

Kamil Dąbrowski