2010-08-07 4 views
11

저는 steampowered.com에서 프로필을 읽으려면 PHP의 cURL 함수를 사용하고 있습니다. 검색된 데이터는 XML이며 처음 약 1000 바이트 만 필요합니다.PHP의 cURL 함수의 다운로드 크기를 제한하는 데 문제가 있습니다

내가 사용하는 방법은 Stack Overflow 응답 (curl: How to limit size of GET?)에서 읽은 Range 헤더를 추가하는 것입니다. 내가 시도한 또 다른 방법은 curlopt_range를 사용하는 것이었지만 역시 작동하지 않았다.

<? 
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; 
$curl_handle = curl_init($curl_url); 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt ($curl_handle, CURLOPT_HTTPHEADER, array("Range: bytes=0-1000")); 

$data_string = curl_exec($curl_handle); 

echo $data_string; 

curl_close($curl_handle); 
?> 

이 코드가 실행되면 모든 것을 반환합니다.

PHP 버전 5.2.14를 사용하고 있습니다.

+3

쿼리하는 서버가 범위를 지원하는지 확인하십시오. 왜냐하면 커맨드 라인에서 시도 할 때 나는 전체 doc을 얻었고, 그것은 steamcommunity.com이 그 기능을 사용할 수 없다고 믿게한다. – Doon

답변

18

서버가 Range 헤더를 사용하지 않습니다. 가능한 한 더 많은 데이터를 수신하는 즉시 연결을 취소하는 것이 가장 좋습니다. 예 :

<?php 
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; 
$curl_handle = curl_init($curl_url); 

$data_string = ""; 
function write_function($handle, $data) { 
    global $data_string; 
    $data_string .= $data; 
    if (strlen($data_string) > 1000) { 
     return 0; 
    } 
    else 
     return strlen($data); 
} 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt ($curl_handle, CURLOPT_WRITEFUNCTION, 'write_function'); 

curl_exec($curl_handle); 

echo $data_string; 

는 아마도 더 깨끗하게, 당신은 HTTP 래퍼 (이 --with-curlwrappers 컴파일 한 경우이 또한 컬을 사용) 사용할 수 있습니다. 기본적으로 루프보다 fread에 전화를 걸고 원하는 데이터가 더 많으면 스트림에서 fclose을 호출합니다. allow_url_fopen이 사용 중지 된 경우 전송 스트림 (fopen 대신 fsockopen)을 사용하여 스트림을 열고 헤더를 수동으로 전송할 수 있습니다.

+0

이것은 트릭을했다! 하지만, 나는 CURLOPT_WRITEFUNCTION의 메커니즘을 완전히 이해하지 못했습니다. 거기에 무슨 일이 일어나는지 설명해 주시겠습니까? 다시 한번 감사드립니다. – Curtis

+1

@Cur 새로운 데이터가 수신 될 때마다 컬 확장자에 의해 호출되는 콜백입니다. 콜백은 컬 핸들러와 방금 읽은 데이터를 수신합니다. 읽은 바이트 수를 반환해야하며 그렇지 않으면 전송을 중단합니다 (이 마지막 부분은 문서화되지 않았지만 동작으로 보입니다). – Artefacto

+2

@Cur OK 여기에 문서가 있습니다 : "실제로 처리 된 바이트 수를 반환합니다. 해당 금액이 함수에 전달 된 양과 다른 경우 라이브러리에 오류를 알립니다. 그러면 전송이 중단되고 반환됩니다. CURLE_WRITE_ERROR. " http://curl.haxx.se/libcurl/c/curl_easy_setopt.html – Artefacto

관련 문제