2010-12-05 15 views
0

CURLとプロキシを使用してXMLファイルを取得しています。 xml(simplexml_load_string)。PHP CURL - 要求されたファイル全体が完全にダウンロードされていないかどうかを確認する方法

私はより 短い以上だったファイル転送

CURLE_PARTIAL_FILE(18)

..

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

はCURL errnoを介して、このみかんエラーをキャッチします。..何かのように考えました期待される。これは、 サーバーが最初に予期した 転送サイズを報告した後に、 のデータが以前の のサイズと一致しない場合に発生します。

ただし、これは機能しません。プロキシを使用している可能性があります。他に何か確認できますか?私の唯一の考えは、XML文書の最後のビットについてpreg_matchを実行することですが、複数のタイプのXML文書を取得しているので理想的ではないようです。

+0

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

つのログ修正はこの1つである:

一つの簡単な修正はこれですif($ error = curl_error($ ch)){...} '。 –

+0

私は通常、そのようなことをしますが、その特定のコードは、curl_errnoのphp docsから直接コピーされますので、あなたのOCDでそれらを処理しなければなりません。] – Steffan

答えて

1

プロキシで同じ問題が発生しましたが、私はcURLのエラーハンドラを使用して問題を解決できませんでした。

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

と最後にコメントを追加:あなたは両方のスクリプト(1要求し、XMLを提供1)へのアクセスを持っている場合は1が、それはXMLの終わりに期待するユニークなコードを提供要請しています

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

残念ながら、スクリプトを提供するものにアクセスできない。 – Steffan

1

エラーが発生した場合は、取得したXMLファイルが無効であることが既に伝えられています。あなたがしなければならないことは、そのエラーをキャッチしてそれを処理することです。 、あなたは `このようなあなたのコードを短縮することができますあなたの質問とは何の関係もありません注意点としては

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

私は、カール要求が失敗したときにそれを再実行しているので、データの有効性を1か所で確認したいと考えています。私がXML解析ビットに達するときには、「戻ってこない」という点を過ぎてしまいました。そして、私は理想的ではないXMLグラブのグループを(同時に複数のカールを使用して3つ)実行しなければなりません。私はそれを取得した直後にxml文字列をロードしなければならないかもしれません。私の 'xmlManager'クラスではなく、あなたが言うようにしますが、XMLドキュメントを取得するコードの分割を維持しません。それらを解析します。 – Steffan

+0

まあ...それは、それが有効なXMLであるかどうかを確認するためだけに、カール要求を行った直後にロードしようとすることができます。あるいは、これがあまりにもオーバーヘッドであれば、単純な正規表現でルートタグを探し、それが閉じられるかどうかを調べることができます。 –

+0

これをチェックするだけの負荷を考えなかったのですが、私はプロキシが入ってくるまでに時間がかかりすぎるので、2回ロードすることによって多くを失うことはないと思っています。とにかく大きなことではない。 – Steffan

関連する問題