Guzzle의 proxy 옵션은 완전한 엔드포인트 URL을 받습니다. 해당 작업만 선택한 IP를 사용해야 한다면 요청에 설정하세요.

<?php
require __DIR__ . '/vendor/autoload.php';

$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://example.com/', [
    'proxy' => 'http://203.0.113.10:8080',
    'connect_timeout' => 5,
    'timeout' => 15,
    'http_errors' => false,
]);

echo $response->getStatusCode(), PHP_EOL;
echo (string) $response->getBody();

예시는 Composer로 Guzzle 7을 설치했다고 가정합니다. 문서용 주소를 제공업체나 HTTP 프록시 목록의 실제 HTTP 프록시로 바꾸세요. 요청 URL에는 대상을 유지합니다. 프록시는 중개자이며 다운로드할 리소스가 아닙니다.

여기서는 http_errors가 false이므로 HTTP 오류 응답도 살펴볼 수 있습니다. 연결 실패는 여전히 전송 예외를 발생시킵니다. 따라서 설정 중 거절된 HTTPS 터널은 일반 웹사이트 응답 객체를 받기 전에 실패할 수 있습니다.

연결 제한이 다르게 작동하면 핸들러 확인하기

Guzzle은 여러 HTTP 핸들러를 사용할 수 있습니다. 문서에 따르면 내장 cURL 핸들러가 connect_timeout를 지원합니다. 사용자 정의 핸들러나 PHP cURL이 없는 환경은 반드시 동등하지 않습니다. 복사한 시간 제한 옵션이 작동한다고 가정하기 전에 앱이 사용하는 핸들러를 확인하세요.

전체 timeout도 설정할 만합니다. 무료 목록 항목은 확인 사이에 응답을 멈출 수 있으며, 기본값은 신속히 끝나야 하는 요청의 유용한 마감 시간이 아닙니다.

프록시 맵 사용하기

맵을 사용하면 대상 스킴별로 경로를 선택하고 우회할 호스트를 명시할 수 있습니다.

'proxy' => [
    'http' => 'http://203.0.113.10:8080',
    'https' => 'http://203.0.113.10:8080',
    'no' => [],
],

문자열 옵션 대신 이 배열을 사용하세요. HTTPS 키는 HTTPS 대상을 선택하며 HTTP 값은 여전히 프록시 리스너를 설명합니다. 리스너 프로토콜이 다르면 엔드포인트 설정도 달라져야 합니다.

요청의 proxy 옵션을 직접 제공하면 Guzzle은 원하는 no 값도 직접 제공할 것을 기대하며 NO_PROXY에서 자동으로 복사하지 않습니다. 빈 목록은 분리된 프록시 테스트에 유용합니다. 의도적인 우회 규칙이 있는 앱이라면 그 규칙을 명시적으로 보존하세요.

관련 글