2010-12-05 19 views
0

J'utilise CURL et un proxy pour récupérer des fichiers XML, parfois seulement une partie du document XML arrive et échoue lorsque j'essaie de charger/utiliser le xml (simplexml_load_string).PHP CURL - comment savoir si le fichier entier demandé n'a pas été entièrement téléchargé

Je pensais que quelque chose comme ..

if(curl_errno($ch)) 
    { 
     $error = curl_error($ch); 
     // handle error 
    } 

attraperions cette erreur sorta via CURL errno ..

CURLE_PARTIAL_FILE (18)

Un transfert de fichiers est plus court ou plus que attendu. Cela se produit lorsque le serveur signale d'abord une taille de transfert attendue , puis délivre des données qui ne correspondent pas à la taille donnée précédemment .

Cependant, cela ne fonctionne pas, je pense que cela pourrait être dû à l'utilisation d'un proxy. Y at-il autre chose que je puisse vérifier? Ma seule pensée maintenant est de faire un preg_match pour le dernier morceau du document XML, mais cela semble moins qu'idéale car je reçois plusieurs types de documents XML et je devrais écrire des contrôles pour chaque type.

+0

Comme une note qui n'a rien à voir avec votre question, vous pouvez réduire votre code comme ceci ' if ($ error = curl_error ($ ch)) {...} '. –

+0

Je fais habituellement ce genre de chose, mais ce morceau de code particulier est copié directement à partir des php docs pour curl_errno donc vous devrez travailler votre OCD sur eux:] – Steffan

Répondre

1

J'ai rencontré le même problème avec un proxy et je n'ai pas réussi à résoudre le problème en utilisant les gestionnaires d'erreurs de cURL. Si vous avez accès aux deux scripts (celui qui demande et celui délivrant le XML) ont la demande d'un livrer un code unique qui s'attend à la fin du XML:

// Request 
http://localhost/getxml.php?id=4&uniq=1337 

Et ajouter un commentaire à la fin de la sortie:

<?xml encoding="..." ..?> 
... 
<!--1337--> 
+0

Je n'ai pas accès à celui qui livre malheureusement les scripts. – Steffan

1

Eh bien, ayant une erreur vous indique déjà que le fichier XML que vous avez obtenu est invalide. Ce que vous devez faire, c'est attraper cette erreur et la gérer.

Une solution rapide est la suivante:

$xml = @simplexml_load_string($xmlString); 
if($xml === false){ /* The XML was not valid. */ } 

Un correctif journal est celui-ci:

libxml_use_internal_errors(true); 
libxml_clear_errors(); 
$xml = simplexml_load_string($xmlString); 
if(($err = libxml_get_last_error()) !== false){ /* We got ourselves an XML error. */ } 
+0

J'espère garder mes contrôles sur la validité des données ensemble dans un endroit pendant que je réexécute la demande de boucle quand elle échoue. Au moment où j'arrive au bit d'analyse syntaxique XML, c'est passé un "point de non-retour", et je devrais exécuter à nouveau un groupe de saisies XML (3 à la fois avec multi curl) ce qui est loin d'être idéal. Il se peut que je doive charger la chaîne xml juste après l'avoir récupérée ... au lieu de plus tard dans ma classe 'xmlManager' qui ferait comme vous le dites, mais ne conserverait pas ma segmentation de code qui saisit les documents XML, et le code les analyse. – Steffan

+0

Eh bien ... Vous pouvez essayer de charger immédiatement après avoir fait la requête curl juste pour voir si c'était un XML valide. Ou, si c'est trop de surcharge, vous pouvez rechercher la balise racine (avec une simple regex) et voir si elle se ferme. –

+0

N'a pas pensé à le charger juste pour vérifier .. Je suis plus limité par le temps qu'il faut pour que les proxies arrivent, donc je ne pense pas que je vais perdre beaucoup en les chargeant deux fois. pas trop gros de toute façon. – Steffan