Настройка прокси в Guzzle (PHP)

Прокси в Guzzle для PHP: опция proxy в клиенте или запросе, логин и пароль в адресе, SOCKS5 через socks5h и фиксированный порт для одного IP.

Обновлено · Редакция Prokso

Данные для подключения
Хост
gw.prokso.com
Порт
823 HTTP · 824 SOCKS5 — новый IP на каждый запрос · 10000–20000 фиксированный IP (sticky-сессия), HTTP(S) и SOCKS5
Логин и пароль
в кабинете, на странице плана

Готовые строки в нужном формате генерирует кабинет: выберите страну, тип IP и протокол.

Коротко
  • Хост — gw.prokso.com, порты 823 (HTTP), 824 (SOCKS5), 10000–20000 (фиксированный IP, HTTP или SOCKS5)
  • Логин и пароль — в кабинете на странице плана
  • Проверяйте IP в ответе самого запроса через прокси: страница «Мой IP» в браузере ваш скрипт не проверяет
Прокси в Guzzle: короткая видеоинструкция · 0:30

Пошаговая инструкция, как подключить прокси Prokso в Guzzle (PHP). Займёт несколько минут.

Шаг 1. Возьмите данные прокси в кабинете

Откройте план и скопируйте хост gw.prokso.com, порт, логин и пароль. Порт 823 — HTTP, 824 — SOCKS5 (оба дают новый IP на каждый запрос); порты 10000–20000 — фиксированный IP до 120 минут, работают и как HTTP, и как SOCKS5 (каждый порт — отдельный адрес). Страну задают в логине: логин__cr.ua.

Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси
Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси

Шаг 2. Установите Guzzle

В папке проекта выполните composer require guzzlehttp/guzzle.

Шаг 3. Задайте прокси в настройках клиента

Опция proxy принимает адрес прокси с логином и паролем. Заданная в конструкторе клиента, она действует для всех его запросов; её можно передать и в отдельный запрос.

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

$client = new GuzzleHttp\Client([
    'proxy' => 'http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823',
    'timeout' => 30,
]);

echo $client->get('https://api.ipify.org?format=json')->getBody();

Шаг 4. SOCKS5 и отдельные прокси по протоколу

Для SOCKS5 замените адрес на socks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824 — буква h означает, что и DNS-запросы пойдут через прокси. Опция proxy также принимает массив с ключами http, https и no, если для части адресов прокси не нужен.

Шаг 5. Проверьте вывод

Запустите пример: скрипт обращается к https://api.ipify.org и печатает IP, который видит сайт. Это должен быть адрес прокси, а не ваш. Ошибка 407 означает неверный логин или пароль. Страница «Мой IP» в браузере здесь не поможет: браузер идёт напрямую.

Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес
Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес

Тайм-ауты и обработка ошибок

Задайте оба предела: connect_timeout — на соединение с прокси, timeout — на весь запрос. По умолчанию Guzzle ждёт без ограничения. Опция http_errors в значении false позволяет самому разбирать коды ответа вместо исключений:

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

$client = new GuzzleHttp\Client([
    'proxy' => 'http://USERNAME:PASSWORD@gw.prokso.com:823',
    'connect_timeout' => 10,
    'timeout' => 30,
    'http_errors' => false,   // handle status codes yourself
]);

$res = $client->get('https://prokso.com/ip');
echo $res->getStatusCode(), ' ', $res->getBody();

Код 407 означает, что прокси не принял логин или пароль либо на плане закончился трафик. Коды 403 и 429 приходят от сайта. Расшифровка — на странице коды ошибок прокси.

Много запросов одновременно

Для параллельной загрузки используйте GuzzleHttp\Pool с опцией concurrency: она ограничивает число одновременных запросов. Начните с 10 и повышайте, пока сайт отвечает без ошибок 429. На порту 823 каждый запрос уйдёт с нового IP.

Спецсимволы в логине и пароле

Адрес прокси — это URL, поэтому символы @, : и # в пароле ломают его разбор. Пропустите логин и пароль через rawurlencode() перед тем, как собирать строку. Страна задаётся в логине, например USERNAME__cr.de, — кодировать нужно уже готовый логин целиком.

Вопросы и ответы

Как держать один IP для нескольких запросов?

Замените порт 823 на фиксированный порт из диапазона 10000–20000: все запросы через него будут идти с одного адреса до 120 минут.

Получаю ошибку cURL про прокси. Что проверить?

Проверьте соответствие протокола и порта: 823 — только HTTP, 824 — только SOCKS5, порты 10000–20000 принимают оба. Код 407 означает неверный логин или пароль.

Нужно ли расширение cURL для PHP?

Желательно. С ним Guzzle работает быстрее и поддерживает SOCKS5. Без него используется потоковый обработчик PHP, у которого возможностей меньше.

Как задать прокси в Laravel?

HTTP-клиент Laravel построен на Guzzle: передайте те же опции через <code>Http::withOptions(['proxy' => ...])</code>.

Можно ли часть адресов пустить мимо прокси?

Да. Передайте <code>proxy</code> массивом и перечислите исключения в ключе <code>no</code>.