web-dev-qa-db-fra.com

Envoi POST Des demandes sans attendre de réponse?

J'écris un simple service REST, qui répond aux demandes des clients. Tout en PHP.

Mon problème est que, lorsque mon serveur répond à une requête, il risque de bloquer les ressources si le côté client tarde trop à renvoyer la réponse "ok".

Comment puis-je envoyer une demande POST via lib_curl en le configurant pour ne pas attendre les réponses mais pour quitter immédiatement après l'envoi des données POST

Est-ce seulement possible? Je vous remercie !

23
Gotys

Vous ne pouvez pas simplement envoyer des données sans recevoir de réponse avec HTTP. HTTP va toujours demande -> réponse. Même si la réponse est très courte (comme un simple 200 sans texte), il doit y avoir une réponse. Et chaque socket HTTP attendra cette réponse.

Si vous ne vous souciez pas de la réponse, vous pouvez ajouter un processus au serveur qui fait vos demandes, et vous simplement Push vos données de demande (comme un service qui s'exécute en arrière-plan, vérifiant une demande base de données, et toujours en commençant la demande chaque fois qu'une nouvelle entrée a été ajoutée). De cette façon, vous feriez la demande de manière asynchrone et pourriez quitter dès que vous l'ajouteriez à stack .

En outre, comme je l’ai dit plus tôt, le client ne fait pas partie de la communication que vous faites avec php. Php est un langage côté serveur. Ainsi, lorsque le client demande une page Web (le fichier php), le serveur exécute ce fichier (et effectue toutes les requêtes sur les états du fichier php), puis renvoie le résultat au client.

16
poke

Ici: 

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

et le curl: 

 curl_setopt($curl, CURLOPT_TIMEOUT_MS, 1);
 curl_setopt($curl, CURLOPT_NOSIGNAL, 1);
13
Kamil Dąbrowski

Si vous ne vous souciez pas vraiment de la réponse, vous feriez probablement mieux exec- une commande wget. Ceci est mentionné en passant dans certaines des autres réponses, mais voici une fonction très simple pour envoyer un paquet _POST via cette approche (qui est asynchrone et prend 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;
}

Crédits: la fonction a été adaptée de https://segment.com/blog/how-to-make-async-requests-in-php/

8
Ben D

http://curl.haxx.se/mail/lib-2002-05/0090.html

libcurl n’a pas d’interface asynchrone. Vous pouvez le faire vous-même, soit en à l’aide de threads, soit en utilisant la "multi interface" non bloquante proposée par libcurl. Lisez sur l'interface multi Ici: 

http://curl.haxx.se/libcurl/c/libcurl-multi.html

Exemple PHP de multi interface est ici:

http://www.phpied.com/simultaneuos-http-requests-in-php-with-curl/

2
Tahir Akhtar

Je n'ai jamais essayé cela, mais régler le CURLOPT_TIMEOUT sur une valeur très faible pourrait faire l'affaire. Essayez 0 ou 0.1.

Cependant, je ne sais pas comment cURL et le client se comporteront de la sorte, si la connexion sera activement annulée si la connexion est déjà établie et si le délai d'attente est atteint. Tu devrais essayer. Si vous appelez des scripts PHP, peut-être que ignore_user_abort() peut vous assurer que vos scripts s'exécutent dans les deux sens.

1
Pekka 웃

Comme d'autres personnes le disent quand vous faites une requête http, vous devez attendre la réponse.

Dans PHP, vous pouvez faire la requête en utilisant la fonction exec.

Vérifiez ce lien: commande php exec (ou similaire) pour ne pas attendre le résultat

0
JesusIniesta