PHP cURL 응답이 잘렸는가?
다운로드한 크기를 Content-Length와 비교하기 전에 cURL의 전송 결과, 응답 상태, 본문 표현을 확인하세요.
프록시를 통해 다운로드한 페이지가 불완전해 보일 때는 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를 실행하지 않습니다. 브라우저가 표시하는 섹션은 전송된 모든 바이트가 도착했더라도 원래 응답에 없을 수 있습니다.