cURL 쓰기 콜백은 본문의 제한된 접두부를 보관하고 그 한도에 도달하는 즉시 전송을 중단할 수 있습니다. 의도한 중단인지 다른 쓰기 실패인지는 직접 만든 플래그로 구분하십시오.

대상 URL이 이미 설정된 새 핸들의 경우:

$limit = 32768;
$prefix = '';
$limitReached = false;

curl_setopt_array($ch, [
    CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
    CURLOPT_HEADER => false,
    CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
        use (&$prefix, &$limitReached, $limit) {
        $remaining = $limit - strlen($prefix);
        $prefix .= substr($chunk, 0, $remaining);

        if (strlen($prefix) >= $limit) {
            $limitReached = true;
            return 0;
        }

        return strlen($chunk);
    },
]);

$result = curl_exec($ch);
$error = curl_errno($ch);

$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
    throw new RuntimeException(curl_error($ch), $error);
}

프록시 URL의 socks5h 스킴은 대상 호스트 이름 확인을 프록시에 맡깁니다. 표시된 새 핸들에서 허용된 공개 대상으로 시험할 때 SOCKS5 프록시 목록의 계정이 필요 없는 항목이 그 엔드포인트를 제공할 수 있습니다. TLS 인증서 검증은 평소 설정을 그대로 유지합니다.

비어 있지 않은 청크에 0을 반환하면 libcurl에는 콜백이 전달된 데이터를 받아들이지 않았다고 알려집니다. CURLE_WRITE_ERROR와 함께 중단됩니다. 여기서는 그 오류와 콜백의 limitReached 플래그가 함께 나타난 경우만 예상된 것으로 봅니다.

한도보다 짧은 응답은 정상적으로 끝납니다. 한도 이상이면 마지막 콜백이 더 큰 청크를 받더라도 prefix는 최대 32 KiB만 보관합니다. 청크 크기는 달라지며, 요청한 버퍼 크기가 고정 길이 호출을 보장하지는 않습니다.

이것은 보관되는 본문을 제한할 뿐, 이미 버퍼에 들어갔거나 연결에서 전송된 모든 바이트를 제한하지는 않습니다. 접두부는 멀티바이트 문자, JSON 값 또는 HTML 요소의 중간에서 끝날 수 있으므로 완전히 파싱 가능한 문서라고 가정하지 마십시오.

관련 글