프록시를 통해 다운로드한 페이지가 불완전해 보일 때는 cURL의 결과부터 확인합니다. 짧은 응답, 실패한 전송, 완전한 차단 페이지는 서로 다른 설명이 필요합니다.

기존에 구성된 핸들에서 CURLOPT_RETURNTRANSFER가 켜져 있는 상태에서:

$body = curl_exec($ch);
if ($body === false) {
    throw new RuntimeException(curl_error($ch), curl_errno($ch));
}

$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$downloaded = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD_T);
$declared = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T);

핸들을 해제하기 전에 이 값들을 수집하세요. 엄격한 비교는 전송 실패를 빈 문자열이나 “0” 같은 정상 본문과 구분합니다. HTTP 오류 상태는 자동으로 curl_exec 실패가 아니므로 상태도 해석해야 합니다.

다운로드 카운터는 헤더를 포함하지 않습니다. 선언된 값은 Content-Length에서 오며 크기를 모를 때는 -1입니다. 응답이 Content-Length를 정당하게 생략할 수 있으며, 알 수 없는 값은 잘린 파일의 진단이 아닙니다.

자동 콘텐츠 디코딩은 또 다른 구분을 더합니다. Content-Length는 보통 압축된 표현을 설명하지만, PHP 문자열에는 압축이 풀린 바이트가 들어 있을 수 있습니다. strlen($body)를 그 헤더와 비교하는 것은 서로 다른 표현을 비교하는 일입니다.

전송이 예상 크기를 위반하면 cURL이 CURLE_PARTIAL_FILE을 보고할 수 있습니다. 비어 있지 않은 출력을 모두 성공으로 보지 말고 그 오류를 보존하세요. 반대로 작은 200 응답을 받은 성공적인 전송은 원본이나 프록시가 돌려주기로 선택한 페이지 전체일 수 있습니다.

마지막으로 필요한 내용을 확인하세요. cURL이 가져온 HTML은 페이지를 채우기 위해 JavaScript를 실행하지 않습니다. 브라우저가 표시하는 섹션은 전송된 모든 바이트가 도착했더라도 원래 응답에 없을 수 있습니다.

관련 글