2010-01-21 4 views
1

J'utilise le PHP suivant:PHP simplexml_load_file attraper 403

$xml = simplexml_load_file($request_url) or die("url not loading"); 

J'utilise:

$status = $xml->Response->Status->code; 

Pour vérifier l'état de la réponse. 200 bening tout est ok, continuez.

Cependant, si j'obtiens une erreur d'accès refusé 403, comment puis-je l'attraper en PHP pour que je puisse retourner un avertissement convivial?

Répondre

8

Pour récupérer le code de réponse HTTP d'un appel à simplexml_load_file(), la seule façon que je connaisse est d'utiliser le peu connu $http_response_header de PHP. Cette variable est créée automatiquement en tant que tableau contenant chaque en-tête de réponse séparément, chaque fois que vous effectuez une requête HTTP via l'encapsuleur HTTP. En d'autres termes, chaque fois que vous utilisez simplexml_load_file() ou file_get_contents() avec une URL qui commence par « http: // »

Vous pouvez vérifier son contenu avec un print_r() tel que

$xml = @simplexml_load_file($request_url); 
print_r($http_response_header); 

Dans votre cas, cependant, vous peut vouloir récupérer le XML séparément avec file_get_contents() puis, tester si vous avez une réponse 4xx, sinon, passez le corps à simplexml_load_string(). Par exemple:

$response = @file_get_contents($request_url); 
if (preg_match('#^HTTP/... 4..#', $http_response_header[0])) 
{ 
    // received a 4xx response 
} 

$xml = simplexml_load_string($response); 
+0

J'aurais dû être un peu plus clair - bien que cela fonctionne et me permet d'attraper l'erreur et d'arrêter le script d'essayer de faire quelque chose de plus. Je reçois toujours le message d'avertissement par défaut: Avertissement: file_get_contents (http://domain.com) [function.file-get-contents]: échec de l'ouverture du flux: requête HTTP a échoué! HTTP/1.0 403 Interdit La raison pour laquelle je les attrape est que je fais plusieurs requêtes et que je veux attraper correctement l'erreur quand cela arrive et donner un avertissement convivial plutôt que le défaut. – Scoobler

+1

Ensuite, vous utilisez l'opérateur mute @ comme démontré dans l'extrait mis à jour. http://docs.php.net/manual/fr/language.operators.errorcontrol.php –