2010-11-19 25 views
4

Je suis en train d'effectuer une requête curl sur une page. J'ai placé 'CURLOPT_TIMEOUT' (à 6 secondes) et 'CURLOPT_CONNECTTIMEOUT' (à 4 secondes) - et les deux fonctionnent parfaitement pour la plupart des URL. Cependant, lorsqu'une page Web ne répond pas (et provoque finalement CURL à travers une erreur «Impossible de résoudre l'hôte» (err_no 6)) - il semble que «CURLOPT_TIMEOUT» n'a aucun effet et curl attendra, peut-être indéfiniment ou jusqu'à expiration d'un autre délai.Comment puis-je modifier le délai d'attente php curl lorsque curl tente de résoudre l'hôte (curl err_no 6)

Avec l'URL que je suis en train d'accéder, CURL semble toujours prendre à peu près exactement 15 secondes avant qu'il ne retourne (qui n'a rien à voir avec le « CURLOPT_TIMEOUT » ou «CURLOPT_CONNECTTIMEOUT.

Quelqu'un peut dire moi comment je peux limiter la quantité de temps un CURL passe pour tenter de résoudre une foule

Répondre

3

Eh bien, vous avez 3 temps morts sur vos mains là-bas

  1. CURLOPT_TIMEOUT -. combien de temps l'opération prend
  2. CURLOPT_CONNECTTIMEOUT - Combien de temps attend cURL pour l'hôte de répondre à sa demande
  3. DNS Lookup délai d'attente - ce que vous rencontrez, la requête DNS échoue et prend un certain temps pour ce faire

cURL en PHP n'a pas de méthode par défaut pour définir ce délai, je suggère de résoudre le nom d'hôte en utilisant une autre méthode avec un délai, puis en passant l'IP à cURL.

+0

fantastiques! Je vais voir comment cela peut être fait, merci! –

+0

Cela ne va pas être particulièrement facile, car DNS est une affaire synchrone qui bloque le processus. Il y a 'adns' (http://www.chiark.greenend.org.uk/~ian/adns/) - qui fournit des recherches asynchrones, c'est ancien mais fonctionnel. Probablement assez facile d'appeler dig ou nslookup en externe et de tuer le processus si cela prend trop de temps, mais cela introduit des frais généraux. Si vous pouvez utiliser pcntl_fork(), alors vous pouvez démarrer un nouveau thread pour le faire, ou utiliser pcntl_alarm() pour sortir du blocage tôt. – Orbling

0

En fait, CURLOPT_CONNECTTIMEOUT inclut l'heure de la requête DNS. Testé en PHP 5.4.9.

1

changement de délai d'attente dns résolution avant CURL

putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');