2012-12-10 5 views
2

J'utilise une simple instruction cURL pour analyser XML sur mon site. Lorsque l'API fonctionne et fonctionne, elle fonctionne correctement, mais dès que l'API est désactivée pour une raison quelconque, le site entier tombe en panne.Pas de réponse de XML en utilisant cURL

$url = 'http://www.mydomain.com/webservicexample'; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
$data = curl_exec($ch); 
curl_close($ch); 

$xml = new SimpleXmlElement($data); 

Y at-il une condition que je peux mettre autour de l'URL afin qu'elle ne réalise que le script cURL s'il y a une réponse positive de l'API? J'ai essayé ce qui suit, mais cela n'a pas fonctionné parce qu'il n'a jamais obtenu une réponse du serveur pour donner les en-têtes:

$url_headers = @get_headers($url); 
if($url_headers[0] == 'HTTP/1.1 200 OK') { 

    // do script 
} 

Toute aide/conseils très appréciés!

+1

Avez-vous essayé de supprimer le '@' avant 'get_headers()' pour montrer des erreurs? –

+0

Regardez dans les journaux d'erreurs pour voir quelle erreur bloque le script. – Ranty

+0

@Titanium - J'ai essayé mais cela n'a toujours pas fonctionné –

Répondre

1

Vous pouvez vérifier la valeur de retour de curl_exec():

if (false === ($data = curl_exec($ch))) { 
    die("Eek! Curl error! " . curl_error($ch)); 
} 

et vérifier les en-têtes de réponse aussi:

if (200 !== (int)curl_getinfo($ch, CURLINFO_HTTP_CODE)) { 
    die("Oh dear, no 200 OK?!"); 
} 
+0

Merci pour votre contribution, ma réponse ci-dessous travaille pour moi, mais la vôtre semble que cela devrait fonctionner aussi. –

+0

@AdamMoss Aucun problème, ma réponse a seulement résolu la partie de savoir quand la demande échoue (pour une raison quelconque); il n'a pas pris en compte qu'un timeout devrait être établi pour éviter d'avoir à attendre 60 secondes avant d'abandonner. –

0

En fin de compte, j'ai pu le faire fonctionner en fixant un délai de temporisation avec CURLOPT_TIMEOUT et CURLOPT_CONNECTTIMEOUT, puis placez un conditionnel à l'aide de curl_errno().

$ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
    $data = curl_exec($ch); 

    if(!curl_errno($ch)) 
    { 
     curl_close($ch); 
     $xml = new SimpleXmlElement($data); 
     return $xml; 
    } 
Questions connexes