Краткое содержание
- Guzzle принимает URL-прокси как по умолчанию для клиента, так и в качестве параметра для отдельного запроса. Используйте значение по умолчанию для клиента, когда каждый запрос должен следовать одному маршруту; используйте параметр запроса, когда только отдельные вызовы нуждаются в прокси.
- Аутентифицированный URL-прокси может включать схему, имя пользователя, пароль, хост и порт. Храните этот URL в секретном хранилище, поддерживаемом окружением, вместо того чтобы сохранять его в исходном коде PHP.
- Массивная форма опции
proxyGuzzle сопоставляет отдельные конечные точки с HTTP и HTTPS и поддерживает список обходаno. Если вы сами предоставляете массив, разберитеNO_PROXYв значениеno. - Ротация прокси может происходить на стороне провайдера или в вашем приложении. Ротация на стороне провайдера упрощает код PHP; ротация на стороне приложения дает явный выбор конечной точки и отслеживание сбоев.
- Успешный HTTP статус недостаточен для подтверждения, что прокси активен. Проверьте наблюдаемый выходной IP, подтвердите содержимое ответа и отдельно запишите сбои соединения, отличные от ошибок целевого сервера.
Что такое прокси Guzzle?
Прокси Guzzle — это промежуточная конечная точка, которую Guzzle использует для отправки HTTP-запроса до того, как этот запрос достигнет своего назначения. Прокси видит исходящее соединение, пересылает запрос и возвращает ответ назначения в ваше приложение PHP. На практике Guzzle продолжает формировать запрос и представлять ответ, в то время как прокси определяет сетевой маршрут и видимый исходный IP.
Эта функция исходит из опции запроса Guzzle proxy, а не из отдельного плагина. официальная документация по опции прокси Guzzle принимает либо один URL-прокси для каждого протокола, либо ассоциативный массив для протокольных маршрутов. Этот URL может содержать учетные данные для аутентификации. Этот дизайн работает с частными шлюзами, такими как Nstdata Residential Prime Proxies, внутренним корпоративным прокси или локальным прокси для отладки.
Прокси изменяет сетевой путь; это не делает каждый запрос действительным или авторизованным. Вашему приложению все еще нужны разумные таймауты, проверки статуса, валидация схемы и соблюдение условий целевого сервера и применимого законодательства. Для более широкого объяснения на уровне PHP смотрите руководство по настройке прокси на PHP от Nstdata.
Почему стоит использовать прокси с Guzzle?
Прокси с Guzzle полезен, когда сервис на PHP должен контролировать, откуда исходят запросы, разделять классы трафика, тестировать локализованные ответы или использовать управляемый маршрут выхода. Общие авторизованные случаи включают контроль качества, проверку рекламы, мониторинг цен, сбор публичных данных и тестирование сети.
Решение о маршрутизации должно соответствовать рабочей нагрузке. Стабильная сессия может помочь, когда несколько вызовов принадлежат одному логическому рабочему процессу, в то время как ротация маршрута может распределить независимые запросы по пулу, управляемому провайдером. IP-ротация описывает шаблон маршрутизации, но не заменяет ограничения по скорости на уровне приложения или валидацию ответов.
Guzzle остается ответственным за HTTP-поведение вокруг маршрута. Клиент может применять таймауты соединения и общего времени, по умолчанию выбрасывать ошибки HTTP и предоставлять статистику передачи. Эти средства помогают различать сбои соединения прокси и действительные ответы 403, 429 или 500, возвращаемые целевым сервером.
Предварительные требования
Вам нужны PHP, Composer, текущий пакет Guzzle, авторизованный тестовый URL и один или несколько URL-прокси. Текущий репозиторий Guzzle рекомендует установку через Composer, а страница пакета Guzzle на Packagist перечисляет поддерживаемые ограничения PHP для каждого релиза.
Установите Guzzle в вашем проекте:
composer require guzzlehttp/guzzle
Храните полный аутентифицированный конечный пункт вне контроля исходного кода. В примерах используется PROXY_URL для одной конечной точки, PROXY_URLS для списка, разделенного запятыми, и TARGET_URL для авторизованного назначения. Значение обычно имеет следующую форму:
http://USERNAME:PASSWORD@PROXY_HOST:PROXY_PORT
Кодируйте зарезервированные символы URL, когда учетные данные содержат @, :, /, # или %. Не выводите URL-прокси в логах, так как это может раскрыть как имя пользователя, так и пароль.
фон: радиальный градиент(круг на 70% 48%, rgba(255,255,255,.94), rgba(255,255,255,0) 34%), линейный градиент(107deg,#f4f5f7,#fafbfc 50%,#f3f4f6);
}
.макет { ширина: 100%; схлопнуть границы; фиксированная таблица-раскладка; }
.копировать-клетка { ширина: 42%; отступ: 42px 14px 32px 36px; вертикальное выравнивание: верх; }
.визуальная-клетка { ширина: 58%; отступ: 32px 12px 24px 0; вертикальное выравнивание: верх; переполнение: скрыто; }
h1 { отступ: 0; размер шрифта: 24px; высота строки: 1.25; жирность шрифта: 650; интервал между буквами: -.4px; }
.описание { отступ: 16px 0 0; размер шрифта: 15px; высота строки: 1.6; жирность шрифта: 400; интервал между буквами: -.1px; }
.призыв-к-действию {
отображение: встроенный блок; минимальная ширина: 142px; верхний отступ: 22px; отступ: 10px 20px 11px; радиус границы: 999px;
фон: линейный градиент(180deg,#2468ff 0%,#124be8 100%); тень: вставленная 0 1px 0 rgba(255,255,255,.24), 0 1px 2px rgba(28,79,221,.15);
цвет: #fff; размер шрифта: 15px; высота строки: 1.3; выравнивание текста: центр; декорирование текста: нет; пробел: nowrap;
}
.прокси-визуализация {
положение: относительное;
ширина: 625px;
высота: 258px;
отступ: 0 -212px -88px 4px;
трансформация: масштаб(.66);
точка трансформации: верхний левый;
}
.пилюля-режима {
положение: абсолютное; верх: 7px; левый: 263px; z-index: 4; высота: 38px; отступ: 8px 13px 8px 39px; граница: 1px solid #dde0e6;
радиус границы: 8px; фон: rgba(255,255,255,.94); тень: 0 1px 2px rgba(20,30,50,.03); размер шрифта: 16px; высота строки: 20px;
}
.значок-ссылки { положение: абсолютное; верх: 9px; левый: 12px; ширина: 18px; высота: 18px; цвет: #1e5eff; }
.карта-клиента {
положение: абсолютное; верх: 75px; левый: 0; z-index: 3; ширина: 95px; высота: 102px; граница: 1px solid #d7dbe2; радиус границы: 18px;
фон: rgba(255,255,255,.89); выравнивание текста: центр; тень: 0 1px 2px rgba(20,30,50,.02);
}
.монитор { положение: относительное; ширина: 35px; высота: 25px; отступ: 18px авто 12px; граница: 2px solid #626772; радиус границы: 3px; }
.монитор:до { контент: ""; положение: абсолютное; слева: 15px; низ: -9px; ширина: 2px; высота: 8px; фон: #626772; }
.монитор:после { контент: ""; положение: абсолютное; слева: 9px; низ: -11px; ширина: 15px; высота: 2px; фон: #626772; радиус границы: 2px; }
.ярлык-клиента { размер шрифта: 18px; высота строки: 22px; }
.карта-nst {
положение: абсолютное; верх: 63px; левый: 248px; z-index: 3; ширина: 118px; высота: 124px; граница: 1.5px solid #81a4ff; радиус границы: 22px;
фон: rgba(255,255,255,.94); тень: 0 8px 20px rgba(53,98,215,.08); выравнивание текста: центр;
}
.логотип-шестиугольника { ширина: 58px; высота: 58px; отступ: 15px авто 2px; }
.ярлык-nst { цвет: #1552ee; размер шрифта: 19px; жирность шрифта: 600; высота строки: 24px; }
.линия-клиента { положение: абсолютное; верх: 124px; левый: 95px; z-index: 1; ширина: 153px; граница-вверх: 2px пунктирная #cbd0d8; }
.линия-клиента:до, .линия-клиента:после { контент: ""; положение: абсолютное; верх: -7px; ширина: 12px; высота: 12px; радиус границы: 50%; }
.линия-клиента:до { слева: 62px; фон: #adb4bf; тень: 0 0 0 4px rgba(255,255,255,.7); }
.линия-клиента:после { вправо: -4px; фон: #d2d6dd; }
.линия-основная { положение: абсолютное; верх: 124px; левый: 366px; z-index: 1; ширина: 98px; высота: 2px; фон: #1e59f3; }
.перекресток { положение: абсолютное; верх: 117px; левый: 455px; z-index: 4; ширина: 16px; высота: 16px; радиус границы: 50%; фон: #1e59f3; тень: вставленная 0 0 0 5px #fff; }
.железная-дорога-страны { положение: абсолютное; верх: 60px; левый: 463px; z-index: 1; ширина: 60px; высота: 128px; граница-слева: 2px solid #cdd2da; граница-вверх: 2px solid #cdd2da; граница-вниз: 2px solid #cdd2da; радиус границы: 18px 0 0 18px; }
.карта-страны {
положение: абсолютное; левый: 515px; z-index: 3; ширина: 106px; высота: 50px; граница: 1px solid #d5d9e0; радиус границы: 15px;
фон: rgba(255,255,255,.92); тень: 0 1px 2px rgba(20,30,50,.03); размер шрифта: 18px; высота строки: 48px; пробел: nowrap;
}
.карта-страны.us { верх: 38px; }
.карта-страны.de { верх: 102px; }
.карта-страны.sg { верх: 166px; }
.флаг { отображение: встроенный блок; отступ: 0 12px 0 22px; размер шрифта: 23px; высота строки: 1; вертикальное выравнивание: -2px; }
.точка-страны { положение: абсолютное; левый: 511px; z-index: 4; ширина: 11px; высота: 11px; граница: 3px solid #fff; радиус границы: 50%; фон: #cbd0d8; }
.точка-страны.us { верх: 56px; }.точка-страны.de { верх: 120px; }.точка-страны.sg { верх: 184px; }
@media только экран и (максимальная ширина: 650px) {
.канва { отступ: 12px; }
.копировать-клетку, .визуальная-клетка { отображение: блок; ширина: 100%; }
.копировать-клетку { отступ: 32px 24px 16px; выравнивание текста: центр; }
.описание { высота строки: 1.6; }
.описание br { отображение: нет; }
.визуальная-клетка { отступ: 16px 12px 28px; }
.прокси-визуализация { слева: 50%; отступ: 0 0 -46px -312.5px; точка трансформации: верх центр; трансформация: масштаб(.82); }
}
@media only screen and (max-width: 560px) { h1 { font-size: 22px; }.description { font-size: 14px; }.proxy-visual { transform: scale(.54); margin-bottom: -119px; } } </style> <main class="canvas"> <section class="feature" aria-label="Подключитесь к Nstdata"> < Липкий ## Подробное руководство: Как использовать прокси с Guzzle Guzzle поддерживает три практических паттерна прокси: общий прокси для клиента, маршрутизация на уровне отдельного запроса и управление ротацией на уровне приложения. Следующие примеры выполнены с PHP 8.5.9 и Guzzle 8.0.2 с использованием специально созданного локального прокси, который подтвердил фактическую цель запроса и заголовок аутентификации прокси. ### Метод 1: Установите прокси для всего клиента Guzzle Используйте общий прокси для клиента, когда все запросы, отправленные одним экземпляром `Client`, должны использовать один и тот же маршрут. Клиенты Guzzle являются неизменяемыми, поэтому создайте отдельный прямой клиент, если часть трафика должна обходить прокси. ```php <?php require __DIR__ . '/vendor/autoload.php'; use GuzzleHttp\Client; $proxy = getenv('PROXY_URL'); if ($proxy === false) { throw new RuntimeException('PROXY_URL обязательна'); } $targetUrl = getenv('TARGET_URL') ?: 'https://httpbin.org/ip'; $client = new Client([ 'proxy' => $proxy, 'connect_timeout' => 5, 'timeout' => 15, ]); $response = $client->get($targetUrl); echo $response->getBody(), PHP_EOL;
Клиент применяет proxy, connect_timeout и timeout как значения по умолчанию. Выполненный тест вернул HTTP 200, показал, что запрос достиг прокси, и подтвердил наличие аутентификации. Для продакшна проанализируйте JSON-ответ и сравните заявленный источник с ожидаемым выходом прокси, а не рассматривайте любое ненулевое тело как подтверждение.
Метод 2: Установите прокси для одного запроса
Используйте прокси на уровне отдельного запроса, когда один и тот же клиент Guzzle отправляет смесь прямого и проксированного трафика. Массивная форма делает сопоставление протокола явным и переносит список обхода NO_PROXY в Guzzle.
<?php require __DIR__ . '/vendor/autoload.php'; use GuzzleHttp\Client; $proxy = getenv('PROXY_URL'
Быстрый старт с клиентом Guzzle объясняет, как значения по умолчанию конструктора сливаются в отдельные вызовы. Документация прокси Guzzle добавляет важную деталь: автоматическое управление окружением не избавляет вас от необходимости предоставлять массив proxy. В этом случае ваше приложение должно предоставить список no, как это делает пример.
Метод 3: Переключение прокси-эндпоинтов в PHP
Используйте управляемое приложением переключение, когда у вас есть несколько различных URL прокси и необходимо отслеживать, какой маршрут обслуживал каждый запрос. Этот пример проходит итеративно, чтобы сбои можно было связать с конкретным эндпоинтом; случайный выбор можно добавить после определения политики здоровья и повторных попыток.
<?php require __DIR__ . '/vendor/autoload.php'; use GuzzleHttp\Client; $proxies = array_values(array_filter
Набор проверок использовал два локальных прокси-эндпоинта и выдал proxy=18080 status=200, за которым последовало proxy=18081 status=200. В реальном приложении не записывайте полные URL прокси. Назначьте каждому эндпоинту не секретный ID, отслеживайте успех и задержку по ID и выделяйте маршруты, которые постоянно не могут подключиться.
Стороннее переключение проще, когда один шлюз может вернуть другой исходящий IP или поддерживать «липкую» сессию в соответствии с настроенным продуктом. Переключение на стороне приложения лучше, когда вам нужно выбирать между провайдерами или классами маршрутов. Руководство по прокси curl полезно, когда вы хотите протестировать тот же эндпоинт вне PHP перед отладкой Guzzle.
Как проверить, что прокси Guzzle работает
Вы можете проверить прокси Guzzle, проверив совместно доказательства маршрута и семантику ответа. Корректный тест фиксирует статус ответа, наблюдаемый исходящий IP, тип контента, затраченное время и не секретный идентификатор эндпоинта.
Начните с небольшого эндпоинта, который возвращает IP вызывающего. Выполните запрос один раз без прокси и один раз с прокси, затем сравните указанные адреса. Если адреса совпадают неожиданно, проверьте, обошел ли NO_PROXY пункт назначения или был ли URL прокси прикреплен к неправильному клиенту.
Затем подтвердите ответ перед его использованием. Подтвердите код статуса, ожидаемый тип контента и необходимые ключи JSON; прокси или пункт назначения могут вернуть HTML-страницу с ошибкой с HTTP 200. Глоссарий HTTP-запросов от Nstdata предоставляет краткую справку о границах запроса/ответа.
Наконец, намеренно протестируйте поведение при сбое. Используйте недействительный порт, чтобы подтвердить, что connect_timeout останавливается быстро, используйте ограниченный общий timeout и обрабатывайте GuzzleHttp\Exception\ConnectException отдельно от RequestException. Это различие говорит операциям о том, потерпел ли маршрут неудачу или пункт назначения вернул ошибку HTTP.
Выбор маршрута Nstdata для Guzzle
Резидентные прокси Nstdata подходят для рабочих нагрузок Guzzle, которым нужен аутентифицированный трафик с резидентным прокси с явным выбором сессий и местоположений, доступным через текущую продукцию. Практическое преимущество в том, что PHP требует только стандартный URL прокси; политика маршрутизации остается вне HTTP-клиента. Это разделение полезно для сбора публичных данных, контроля качества, проверок локализации и мониторинга цен, где конфигурация маршрута может изменяться без развертывания кода. Ознакомьтесь с текущими моделями биллинга Residential Prime перед выбором пакета или варианта оплаты по использованию. Правильный план все еще зависит от объема трафика, поведения сессий, совместимости цели и ваших требований к соблюдению правил.
- Стандартная конфигурация Guzzle: Эндпоинт работает через обычный параметр запроса
proxyGuzzle, поэтому для базового маршрутизирования не требуется специфичный для поставщика PHP SDK. - Выбор с учетом сессии: Выберите поведение ротации или «липкости» в рабочем процессе продукта, когда текущая панель управления поддерживает шаблон сессии, необходимый вашему приложению, затем сохраняйте этот эндпоинт стабильным в защищенном хранилище.
- Операционное разделение: Держите учетные данные, варианты маршрутизации и выбор пакета вне исходного кода приложения, в то время как Guzzle обрабатывает тайм-ауты, поведение статус-кода HTTP и разбор ответов.
Не предполагайте, что новый исходящий IP гарантирует действительный ответ. Протестируйте точную цель, протокол, режим сессии и ожидаемый вывод перед увеличением параллелизма.
Общие ошибки прокси Guzzle и их исправление
Сбой прокси Guzzle обычно делится на четыре категории: неправильно сформированные учетные данные, ошибки соединения, проблемы с TLS и ответы от назначения. Установите диагноз на этом уровне, прежде чем добавлять повторные попытки.
| Симптом | Вероятная причина | Практическое решение |
|---|---|---|
407 Требуется аутентификация прокси | Учетные данные отсутствуют, недействительны или неправильно закодированы | Создайте конечную точку заново, URL-кодируйте зарезервированные символы и проверьте тот же URL с помощью ограниченного теста curl. |
ConnectException или тайм-аут соединения | Неправильный хост/порт, недоступный маршрут или неподдерживаемый протокол | Подтвердите конечную точку, установите connect_timeout и протестируйте доступность сети, не exposing.credentials в журналах. |
| Ошибка проверки сертификата | Локальный CA-пакет или перехваченный TLS-удел недействителен | Исправьте конфигурацию CA; не отключайте проверку с помощью verify => false в производственной среде. |
Ответ 403 или 429 | Назначение отклонило или ограничило частоту запроса | Уменьшите скорость запросов, подтвердите авторизацию, проверьте семантику ответа и следуйте опубликованным правилам назначения. |
| Прокси выглядит неиспользуемым | Совпадение с NO_PROXY, опция была применена к другому клиенту или прямой клиент обработал вызов | Запишите не секретный идентификатор маршрута и сравните прямые и проксированные проверки выходного IP. |
Повторные попытки должны быть ограничены и избирательны. Повторяйте временные сбои соединения с отступлением, но не пытайтесь снова при ошибках аутентификации бесконечно. Когда запрос меняет состояние сервера, добавьте защиту идемпотентности перед повтором.
Заключение
Самая чистая настройка прокси Guzzle - это самая маленькая, которая соответствует решению о маршрутизации: клиент по умолчанию для полностью проксированных служб, опция запроса для смешанного трафика или список конечных точек для явной ротации. Держите учетные данные вне системы контроля версий, передавайте NO_PROXY в явные массивные конфигурации, используйте ограниченные тайм-ауты и проверяйте выходной маршрут плюс схему ответа перед тем, как доверять результату.
Начните с одного авторизованного тестового URL и одной прокси-конечной точки, захватите успешную базу, затем добавьте ротацию только когда приложение сможет определить и карантинные сбои. Если рабочий процесс разрастется до нескольких провайдеров, пулов и правил маршрутизации, оцените Nstdata Proxy Manager как отдельный операционный уровень, а не встраивайте больше логики маршрутизации в PHP.
Испытайте Nstdata — Начните свой бесплатный пробный период сегодня
Создайте прокси-конечную точку, протестируйте ее с помощью одного запроса Guzzle и пересмотрите полученный маршрут перед увеличением нагрузки.
Часто задаваемые вопросы
В: Как настроить прокси в Guzzle?
Установите опцию proxy на URL прокси в конструкторе клиента Guzzle или в массиве опций одного запроса. Конфигурация конструктора влияет на каждый запрос, сделанный этим клиентом, в то время как форма для запроса влияет только на этот вызов.
В: Как я могу использовать аутентифицированный прокси с Guzzle?
Используйте URL прокси в формате http://USERNAME:PASSWORD@PROXY_HOST:PROXY_PORT. Храните полное значение в среде с защищенным хранением и URL-кодируйте зарезервированные символы в имени пользователя или пароле.
В: Поддерживает ли Guzzle отдельные прокси для HTTP и HTTPS?
Да, Guzzle принимает ассоциативный массив proxy с ключами http, https и no. Массив no перечисляет имена хостов, которые должны обойти прокси.
В: Использует ли Guzzle автоматически NO_PROXY?
Guzzle может заполнить поведение обхода прокси из среды, но явно предоставленный массив прокси должен включать собственное значение no. Разберите переменную окружения NO_PROXY и передайте полученный список имен хостов в этот ключ.
В: Как я могу узнать, использовал ли Guzzle прокси?
Вызовите авторизованную конечную точку проверки IP с прокси и без него и сравните наблюдаемые адреса. Также проверьте статус ответа и схему, так как HTML-страница с ошибкой или мягкий сбой не доказывает, что маршрут сработал.
В: Должен ли я отключать верификацию TLS, когда прокси Guzzle не работает?
Нет, отключение проверки сертификатов скрывает проблему безопасности и не должно быть исправлением для производства. Вместо этого исправьте пакет CA, конфигурацию прокси TLS, имя хоста или политику перехвата.
В: Могу ли я вращать прокси для каждого запроса Guzzle?
Да, вы можете выбрать другой URL прокси для каждого запроса или использовать ротацию на стороне провайдера за одним шлюзом. Держите конкурентность ограниченной, отслеживайте каждый маршрут с ненастоящим идентификатором и соблюдайте условия назначения и лимиты частоты.





