web-dev-qa-db-fra.com

PHP CURL: CURLOPT_CONNECTTIMEOUT vs CURLOPT_TIMEOUT

PHP a ces deux options liées à l'expiration du délai: CURLOPT_CONNECTTIMEOUT et CURLOPT_TIMEOUT.

Les descriptions sur le site PHP sont un peu vagues. Quelle est la différence?

Pour utiliser un exemple concret: si vous envoyez des vars GET à une URL via cURL et que vous souhaitez recevoir une réponse XML, CURLOPT_CONNECTTIMEOUT correspondrait-il au temps maximal nécessaire pour se connecter au serveur et CURLOPT_TIMEOUT au montant maximal de temps peut-il prendre pour renvoyer le XML?

23
texelate

CURLOPT_CONNECTTIMEOUT est la durée maximale en secondes autorisée à établir la connexion au serveur. Vous pouvez définir cette valeur sur 0 pour désactiver cette limite, mais cela est déconseillé dans un environnement de production.

CURLOPT_TIMEOUT est une durée maximale, en secondes, pendant laquelle l'exécution d'appels de fonction d'extension cURL individuels est limitée. Notez que la valeur de ce paramètre doit inclure la valeur de CURLOPT_CONNECTTIMEOUT.

En d'autres termes, CURLOPT_CONNECTTIMEOUT est un segment de l'heure représenté par CURLOPT_TIMEOUT. La valeur de CURLOPT_TIMEOUT doit donc être supérieure à la valeur de CURLOPT_CONNECTTIMEOUT.

De Différence entre CURLOPT_CONNECTTIMEOUT et CURLOPTTIMEOUT

39
Priyank

CURLOPT_CONNECTTIMEOUT n'est pas un segment de l'heure représenté par CURLOPT_TIMEOUT

Si CURLOPT_CONNECTTIMEOUT est défini sur 3 secondes et CURLOPT_TIMEOUT sur 4 secondes, l'exécution peut durer jusqu'à 7 secondes.

J'ai testé cela en simulant une connexion serveur lente (iptables drop).

25
Miloš

En plus de la réponse acceptée

Selon le code source , les paramètres sont connectés: si les deux sont définis, le plus restrictif est utilisé. Mais seulement au stade de la connexion.

/* if a timeout is set, use the most restrictive one */

  if(data->set.timeout > 0)
    timeout_set |= 1;
  if(duringconnect && (data->set.connecttimeout > 0))
    timeout_set |= 2;

  switch(timeout_set) {
  //...
  case 3:
    if(data->set.timeout < data->set.connecttimeout)
      timeout_ms = data->set.timeout;
    else
      timeout_ms = data->set.connecttimeout;
    break;

Tests unitaires pour la source

4
Timur Gaitov

La réponse acceptée est incorrecte. Voir la documentation Everything CURL pour la documentation appropriée.

Fondamentalement, le temps de connexion couvre deux aspects de l’établissement d’une connexion http:

  • Résolution DNS
  • Temps jusqu'à l'établissement de la connexion TCP.

Cette période n'est PAS AT TOUT couverte par les options CURLOPT_TIMEOUT ou CURLOPT_TIMEOUT_MS. Celles-ci couvrent tout ce qui se passe lorsque nous commençons à parler HTTP via la connexion TCP qui vient d'être établie pendant la phase de connexion.

Cette distinction pose des problèmes à de nombreuses personnes, mais elle permet de définir un délai de connexion relativement court, car si le serveur est complètement indisponible, pourquoi l'attendre? Toutefois, votre délai de requête peut toujours être raisonnablement long, au cas où les temps de réponse attendus pour le service sont difficiles à prévoir.

En règle générale, pour les installations de production, CURLOPT_CONNECTION_TIMEOUT doit durer moins de 5 secondes et CURLOPT_TIMEOUT doit être aussi faible que possible (sans vous obliger à déposer régulièrement des demandes).

1
Rasmus Larsen

CURLOPT_CONNECTTIMEOUT est l'heure de la connexion au serveur uniquement.

CURLOPT_TIMEOUT correspond à tout le temps nécessaire pour se connecter, plus le temps nécessaire pour échanger des données.

CURLOPT_TIMEOUT inclut donc toujours CURLOPT_CONNECTTIMEOUT.

Pour vérifier que c'est très simple, utilisez CURLINFO_CONNECT_TIME et CURLINFO_TOTAL_TIME.

  • curl_getinfo ($ ch, CURLINFO_CONNECT_TIME) obtient les informations et curl_setopt ($ ch, CURLOPT_CONNECTTIMEOUT, $ votreMaxConnTime) définit la valeur maximale à connecter.

  • curl_getinfo ($ ch, CURLINFO_TOTAL_TIME) obtient les informations et curl_setopt ($ ch, CURLOPT_TIMEOUT, $ yourMaxTotTime) définit la valeur maximale de l'opération.

Bien sûr, $ votreMaxTotTime doit être supérieur à $ votreMaxConnTime toujours . Toutes ces valeurs sont en secondes.

0
John