문제

데이터 컬의 양을 제한하는 방법이 있습니까? 50kb의 페이지에서 데이터를 스크래핑하지만 필요한 데이터는 페이지의 상단 1/4에 있으므로 페이지의 첫 10kb 만 검색하면됩니다.

이 대역폭의 약 5GB 만 관련이있는 경우 한 달에 60GB의 데이터를 전송하는 데 필요한 데이터가 많기 때문에 요구합니다.

데이터를 처리하기 위해 PHP를 사용하고 있지만 데이터 검색 접근 방식에서 유연하고 CURL, WGET, FOPEN 등을 사용할 수 있습니다.

내가 고려하고있는 한 가지 접근법은

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

위의 내용은 www.website.com에서 6kb 만 전송한다는 것을 의미합니까?

도움이 되었습니까?

해결책

Curl을 사용하고자하는 것을 달성 할 수도 있습니다.

문서를 보면 curlopt_writefunction CURL에서 읽을 때 데이터를 사용할 수있을 때마다 호출되는 콜백을 등록 할 수 있습니다. 그런 다음 수신 된 바이트를 계산할 수 있으며 6,000 바이트를 받으면 0을 반환하여 나머지 전송을 중단 할 수 있습니다.

그만큼 libcurl 문서화는 콜백을 조금 더 설명합니다.

이 기능은 저장 해야하는 데이터가 수신 되 자마자 libcurl에 의해 호출됩니다. 실제로 처리 된 바이트 수를 반환하십시오. 해당 금액이 기능에 전달 된 금액과 다르면 라이브러리에 오류가 표시되며 전송을 중단하고 Curle_write_error를 반환합니다.

콜백 함수는 모든 호출에서 가능한 많은 데이터가 전달되지만 가정을 할 수는 없습니다. 하나의 바이트 일 수 있으며 수천 일 수도 있습니다.

다른 팁

이것은 실제로 컬이 질문하는 HTTP입니다.

당신이 추측했듯이, fopen을 사용하면 전체 페이지가 다운로드됩니다. 오프셋 5000을 찾는다면

원하는 것을 달성하는 가장 좋은 방법은 HTML RFC에 명시된대로 부분 HTTP GET 요청을 사용하는 것입니다.http://www.w3.org/protocols/rfc2616/rfc2616-sec9.html):

요청 메시지에 범위 헤더 필드가 포함 된 경우 get 메소드의 의미론 "부분 get"으로 변경됩니다. 섹션 14.35에 설명 된대로 엔티티의 일부만 이체되도록 부분적인 GET 요청. 부분 GET 방법은 클라이언트가 이미 보유한 데이터를 전송하지 않고 부분적으로 재조정 된 엔티티를 완료 할 수 있도록 불필요한 네트워크 사용을 줄이기위한 것입니다.

범위를 사용한 부분 GET 요청의 세부 사항은 다음과 같습니다.http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

시도해보십시오 HTTP 범위 요청:

GET /largefile.html HTTP/1.1
Range: bytes=0-6000

서버가 범위 요청을 지원하는 경우, 콘텐츠 범위 헤더와 요청 된 바이트 범위가있는 206 개의 부분 컨텐츠 응답 코드를 반환합니다 (그렇지 않은 경우 200 및 전체 파일을 반환합니다). 보다 http://benramsey.com/archives/206-partial-content-and-range-requests/ 범위 요청에 대한 좋은 설명.

또한보십시오 PHP를 사용하여 파일을 보낼 때 다시 다운로드 할 수 있습니까?.

전체 페이지를 다음과 같이 다운로드합니다 fopen 전화를 걸지만 해당 페이지에서 6kb 만 읽습니다.

PHP 매뉴얼에서 :

다음 조건 중 하나가 충족 되 자마자 읽기 중지됩니다.

  • 길이 바이트가 읽혔습니다
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top