7
votes

Comment puis-je modifier le délai de déroulement PHP lorsque vous tente de résoudre l'hôte (CURL ERR_NO 6)

J'effectue une demande de courbure à une page. J'ai défini à la fois "curlopt_timeout" (à 6 secondes) et "curlopt_connectTimeout" (à 4 secondes) - et les deux fonctionnent parfaitement pour la plupart des URL.

Toutefois, quand une page Web ne répond pas (et provoque enfin une courrière à travers une erreur "Impossible de résoudre l'hôte" (err_no 6)) - il semble que "curlopt_timeout" n'a aucun effet et que curl attendra, éventuellement indéfiniment ou jusqu'à ce que un délai d'attente «autre» expire.

Avec l'URL, j'essaie d'accéder, Curl semble toujours prendre à peu près 15 secondes avant de retourner (ce qui n'a rien à voir avec le "curlopt_timeout" ou "curlopt_connectTimeout".

Quelqu'un peut-il me dire comment je peux limiter la durée d'une courbure qu'une boucle dépense tenter de résoudre un hôte?


0 commentaires

3 Réponses :


3
votes

Eh bien, vous avez 3 fois sur vos mains là-bas.

  1. curlopt_timeout - combien de temps le long de la l'ensemble de l'opération prend
  2. curlopt_connecttimeout - combien de temps Curl attend l'hôte de répondre à sa demande
  3. Délai de recherche DNS - Ce que vous rencontrez, le DNS La requête échoue et prend un certain temps faire cela

    CURL dans PHP n'a pas de méthode par défaut pour définir ce délai d'attente, je suggérerais de résoudre le nom d'hôte à l'aide d'une autre méthode avec un délai d'attente, puis en passant l'adresse IP à curl.


2 commentaires

Fantastique! Je verrai comment cela peut être fait de l'essai, merci!


Cela ne sera pas particulièrement facile, car DNS est une affaire synchrone en règle générale, qui bloque le processus. Il y a des «adns» ( chiark.greenend.org.uk/~ian/adns ) - qui fournit des recherches asynchrones, c'est vieux mais fonctionnel. Probablement assez facile d'appeler Crig ou Nslookup à l'extérieur et tuer le processus s'il faut trop de temps, mais cela introduit les frais généraux. Si vous pouvez utiliser pcntl_fork (), vous pouvez commencer un nouveau fil à le faire ou utiliser pcntl_alarm () pour sortir du verrouillage tôt.



0
votes

En fait, Curlopt_ConnectTimeout inclut le temps de requête DNS. Testé dans PHP 5.4.9.


1 commentaires

En fait, je l'ai défini à 10 secondes et je résolvez le délai d'attente après 2,5 secondes. Testé dans PHP 7.2



2
votes

Changer DNS résolvez le délai d'attente avant d'utiliser CURL

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


1 commentaires

Testé: n'a aucun effet sur php 7.3