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?
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
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).
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
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:
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).
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.