2009-08-14 6 views
1

Nous avons écrit un script qui extrait des données d'un serveur externe. Si le serveur tombe en panne, nous ne voulons pas que notre serveur attende les données car nous traitons beaucoup de données et nous ne voulons pas qu'il s'enlise. Pour remédier à cela, nous essayons de temporiser nos appels curl s'ils prennent plus de quelques centaines de millisecondes.Comment définir un délai d'expiration sur les appels curl PHP5? Les options CURL publiées ne semblent pas fonctionner

J'ai trouvé de la documentation disant que CURLOPT_TIMEOUT_MS et CURLOPT_CONNECTTIMEOUT_MS devraient être disponibles dans ma version de php et libcurl, mais cela ne semble pas être le cas échéant, même si je mets le timeout à 1ms.

$url = "http://www.cnn.com; 

      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $url); 
      curl_setopt($ch, CURLOPT_HEADER,0); //Change this to a 1 to return headers 
      curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1); 
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1); 

      $data = curl_exec($ch); 

      curl_close($ch); 

Est-ce que quelqu'un sait ce que nous faisons mal ou d'une autre façon de le faire?

Répondre

2

vu dans unresponsive dns server and curl multi timeouts not working:

» ... Nous avons eu des moments où un site que nous extraire des informations a eu serveur dns ne répond plus Lorsque cela se produit les délais d'attente fixés dans boucle. (php bindings) ne fonctionne pas comme attendu Il expire après 1min 14 sec avec "Impossible de résoudre l'hôte: www.yahoo.com (nom de domaine non trouvé)" Pour que cela se produise dans le test env nous modifier /etc/resolv.conf pour avoir un nameserver qui n'existe pas (nameserver 1.1.1.1). Pas de mater ce que ils sont fixés à

(CURLOPT_CONNECTTIMEOUT, CURLOPT_CONNECTTIMEOUT_MS 
, CURLOPT_TIMEOUT, CURLOPT_TIMEOUT_MS) 

ils pas de délai quand nous ne pouvons pas obtenir au serveur DNS. J'utilise curl_multi parce que je nous avons plusieurs sources que nous tirons des informations à la même heure . L'exemple ci-dessous appelle un par exemple simplicité. Et en tant que côté note curl_errno ne renvoie pas un code d'erreur même s'il y avait une erreur . Je ne sais pas pourquoi ... "

Questions connexes