웹사이트는 curl_init()에 두고 중간 서버는 해당 핸들에 설정하세요. PHP에는 cURL 확장이 필요합니다. 터미널에서 curl 실행 파일이 동작한다고 확장을 쓸 수 있다는 뜻은 아닙니다.

<?php
$ch = curl_init('https://example.com/');
curl_setopt_array($ch, [
    CURLOPT_PROXY => 'http://203.0.113.10:8080',
    CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
    CURLOPT_NOPROXY => '',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 15,
]);

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

echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL;
echo $body;

문서용 IP와 포트를 자신의 HTTP 프록시 또는 HTTP 프록시 목록의 항목으로 바꾸세요. CURLOPT_NOPROXY는 이 테스트의 우회 규칙을 지우고, CURLOPT_RETURNTRANSFER는 본문을 브라우저에 보내는 대신 반환합니다. 연결 시간 제한은 설정 과정을, 전체 시간 제한은 cURL 작업을 제한합니다.

SOCKS5 엔드포인트는 curl_exec() 전에 HTTP 프록시 옵션을 바꾸세요.

curl_setopt($ch, CURLOPT_PROXY, '203.0.113.10:1080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);

CURLPROXY_SOCKS5_HOSTNAME은 목적지 DNS를 SOCKS 서버에 맡깁니다. 명시된 프로토콜을 사용하세요. 포트 1080만으로는 식별할 수 없습니다. 어느 프록시 옵션도 웹사이트 인증서 검증을 끌 필요가 없습니다.

$body === false를 엄격하게 검사하세요. 본문이 비어도 전송은 성공할 수 있으며, 웹사이트 응답이 생기기 전에 터널이 실패할 수도 있습니다. 반대로 본문이 있어도 403, 404 또는 429가 나올 수 있습니다. CURLINFO_RESPONSE_CODE를 cURL 오류 결과와 함께 읽어 완료된 요청이 작업 목적을 충족하는지 판단하세요.

관련 글