2010-12-05 3 views
0

일부 XML 파일을 가져 오기 위해 CURL과 프록시를 사용하고 있습니다. 때때로로드/사용하려고 할 때 XML 문서의 일부만 통과하여 실패합니다 xml (simplexml_load_string). PHP CURL - 요청한 전체 파일이 완전히 다운로드되지 않았는지 확인하는 방법

나는

이 CURLE_PARTIAL_FILE (18)

파일 전송이 짧거나보다 큰

했다 ..

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

가 errno를 CURL 통해이 그렇다고 오류를 잡을 것입니다 .. 같은 생각 예상했다. 이는 서버가 처음으로 예상 된 전송 크기를보고하고 이전에 크기와 일치하지 않는 데이터 을 전달할 때 발생합니다.

그러나 이것은 작동하지 않으며, 프록시 사용으로 인한 것일 수 있습니다. 내가 확인할 수있는 건 없니? 내 생각은 이제 XML 문서의 마지막 비트에 대해 preg_match를 수행하는 것이지만, XML 문서의 여러 유형을 얻고 각 유형에 대한 검사를 작성해야하므로 이상적인 것 같지 않습니다.

+0

:

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

한 로그 수정이 하나입니다

한 빠른 수정이 있습니다 if ($ error = curl_error ($ ch)) {...}'. –

+0

나는 보통 그 일을하지만, 특정 코드는 curl_errno의 PHP 문서에서 직접 복사되므로 OCD를 직접 작성해야합니다.] – Steffan

답변

1

나는 프록시에서 같은 문제가 발생하여 cURL의 오류 처리기를 사용하여 문제를 해결하지 못했습니다.

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

그리고 마지막에 주석을 추가 : 당신은 두 스크립트에 대한 액세스 권한을 (하나가 요청하고 하나는 XML을 제공)을 하나는 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

내가 실패 할 때 컬 요청을 재실행 할 때 데이터 유효성을 한 곳에서 함께 확인하고 싶습니다. XML 파싱 비트가 생길 무렵에는 '되돌아 오는 지점'이 지나갔고 이상적이지 않은 XML 컬럽 그룹을 다시 한 번에 3 개씩 실행해야합니다. 나는 그것을 잡은 직후에 XML 문자열을로드해야 할 수도 있습니다. 나중에 'xmlManager'클래스 대신 .. 대신 말할 것입니다.하지만 XML 문서를 잡고 코드 조각을 유지 관리하지 않습니다. 그들을 파싱합니다. – Steffan

+0

음 ... 올바른 XML인지 확인하기 위해 컬 요청을 한 직후에로드하려고 시도 할 수 있습니다. 또는 이것이 너무 많은 오버 헤드라면 루트 태그를 (간단한 정규 표현식으로) 찾아서 닫을지를 볼 수 있습니다. –

+0

체크하기 만하면됩니다. 체크를하기 위해로드하는 것에 대해 생각하지 않았습니다. 나는 프록시가 들어오는 데 더 많은 시간이 걸리므로, 두 번로드하지 않아도 많이 잃을 것이라고 생각하지 않습니다. 어쨌든 큰 것은 아닙니다. – Steffan

관련 문제