Перейти к содержимому
Гайды 6 мин чтения 2 просмотров

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

Узнайте, как легко настроить прокси в PHP, используя cURL, Guzzle и file_get_contents. Откройте для себя лучшие практики и готовые решения для ваших проектов.

Настройка прокси-сервера в PHP позволяет маршрутизировать HTTP/HTTPS запросы через промежуточный сервер, и может быть реализована с помощью cURL, библиотеки Guzzle HTTP клиента, или базовой функции file_get_contents.

Общие принципы настройки прокси

Прокси-сервер действует как посредник между клиентским приложением (вашим PHP-скриптом) и целевым веб-сервером. Это используется для управления исходящим трафиком, обеспечения анонимности, обхода географических ограничений, кэширования или мониторинга сетевых запросов.

Основные типы прокси:
* HTTP/HTTPS прокси: Перенаправляет HTTP и HTTPS трафик. Для HTTPS запросов часто используется туннелирование (CONNECT метод).
* SOCKS прокси (SOCKS4/SOCKS5): Прокси на более низком уровне, способный обрабатывать любой сетевой трафик (TCP/UDP), а не только HTTP/HTTPS. SOCKS5 поддерживает аутентификацию и IPv6.

Настройка прокси обычно включает указание его адреса (IP-адрес или доменное имя) и порта. Для прокси, требующих аутентификации, необходимо также предоставить имя пользователя и пароль.

Настройка прокси с cURL

cURL (Client URL Library) является де-факто стандартом для выполнения HTTP-запросов в PHP благодаря своей гибкости и широким возможностям. PHP-расширение php_curl предоставляет интерфейс для работы с этой библиотекой.

HTTP/HTTPS прокси

Для настройки HTTP/HTTPS прокси используется опция CURLOPT_PROXY. Если вы отправляете HTTPS-запрос через HTTP-прокси, обычно требуется включить туннелирование с CURLOPT_HTTPPROXYTUNNEL.

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://api.ipify.org?format=json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Установка HTTP/HTTPS прокси
curl_setopt($ch, CURLOPT_PROXY, 'http://your_proxy_ip:port');

// Для HTTPS через HTTP прокси, включить туннелирование
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);
?>

SOCKS прокси

Для SOCKS прокси используются опции CURLOPT_PROXY (для адреса) и CURLOPT_PROXYTYPE (для указания типа SOCKS).

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://icanhazip.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Установка SOCKS5 прокси
curl_setopt($ch, CURLOPT_PROXY, 'socks5://your_socks_proxy_ip:port');
// Или можно так, если адрес не содержит схему:
// curl_setopt($ch, CURLOPT_PROXY, 'your_socks_proxy_ip:port');
// curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);
?>

Доступные типы SOCKS прокси для CURLOPT_PROXYTYPE:
* CURLPROXY_SOCKS4
* CURLPROXY_SOCKS5
* CURLPROXY_SOCKS4A
* CURLPROXY_SOCKS5_HOSTNAME (позволяет прокси-серверу разрешать имя хоста, а не клиенту)

Прокси с аутентификацией

Для прокси, требующих аутентификации, используются опции CURLOPT_PROXYUSERPWD для учетных данных и CURLOPT_PROXYAUTH для типа аутентификации.

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://whatismyip.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Установка прокси с аутентификацией
curl_setopt($ch, CURLOPT_PROXY, 'http://your_proxy_ip:port');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'username:password');
// Опционально: указание типа аутентификации, по умолчанию cURL пытается определить автоматически
// curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC | CURLAUTH_NTLM);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);
?>

Игнорирование прокси для определенных хостов

cURL поддерживает опцию CURLOPT_NOPROXY, которая позволяет указать список хостов, для которых прокси не должен использоваться. Список может быть разделен запятыми или пробелами.

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, 'http://your_proxy_ip:port');

// Игнорировать прокси для example.com и localhost
curl_setopt($ch, CURLOPT_NOPROXY, 'example.com, localhost');

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);
?>

Настройка прокси с Guzzle HTTP Client

Guzzle — это популярный HTTP-клиент для PHP, который абстрагирует работу с cURL и предоставляет более удобный API. Он является рекомендуемым выбором для большинства современных PHP-приложений.

Для использования Guzzle необходимо установить его через Composer:
composer require guzzlehttp/guzzle

Базовая настройка прокси

Настройка прокси в Guzzle осуществляется через опцию proxy в конфигурации клиента или запроса. Guzzle автоматически определяет тип прокси по схеме (например, http://, https://, socks5://).

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

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client();

try {
    $response = $client->get('http://icanhazip.com', [
        'proxy' => 'http://your_proxy_ip:port' // Или socks5://your_socks_proxy_ip:port
    ]);
    echo $response->getBody();
} catch (RequestException $e) {
    echo 'Ошибка Guzzle: ' . $e->getMessage();
}
?>

Можно также установить прокси глобально для всех запросов, создаваемых данным клиентом:

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

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client([
    'proxy' => 'http://your_proxy_ip:port'
]);

try {
    $response = $client->get('http://icanhazip.com');
    echo $response->getBody();
} catch (RequestException $e) {
    echo 'Ошибка Guzzle: ' . $e->getMessage();
}
?>

Прокси с аутентификацией

Для прокси с аутентификацией учетные данные включаются непосредственно в строку прокси:

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

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client();

try {
    $response = $client->get('http://whatismyip.com', [
        'proxy' => 'http://username:password@your_proxy_ip:port'
    ]);
    echo $response->getBody();
} catch (RequestException $e) {
    echo 'Ошибка Guzzle: ' . $e->getMessage();
}
?>

Игнорирование прокси

Guzzle поддерживает опцию no_proxy, которая позволяет указать хосты, для которых прокси не должен использоваться. Значение может быть строкой с разделителями (запятая, пробел) или массивом строк. Guzzle также учитывает системные переменные окружения no_proxy.

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

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client([
    'proxy' => 'http://your_proxy_ip:port',
    'no_proxy' => 'example.com, localhost' // Или ['example.com', 'localhost']
]);

try {
    // Этот запрос пойдет через прокси
    $response = $client->get('http://external-api.com');
    echo "External API: " . $response->getBody() . "\n";

    // Этот запрос пойдет напрямую, игнорируя прокси
    $response = $client->get('http://example.com');
    echo "Example.com: " . $response->getBody() . "\n";

} catch (RequestException $e) {
    echo 'Ошибка Guzzle: ' . $e->getMessage();
}
?>

Настройка прокси с file_get_contents

file_get_contents — это базовая PHP-функция для чтения содержимого файла или URL. Она может использовать прокси через конфигурацию потоковых контекстов (stream contexts). Однако ее функциональность значительно ограничена по сравнению с cURL или Guzzle.

HTTP/HTTPS прокси

Для HTTP/HTTPS прокси необходимо создать контекст с опциями proxy и request_fulluri.

<?php
$proxy = 'tcp://your_proxy_ip:port'; // 'tcp://' обязателен
$url = 'http://icanhazip.com';

$context = stream_context_create([
    'http' => [
        'proxy' => $proxy,
        'request_fulluri' => true, // Обязательно для прокси
        'method' => 'GET',
        'header' => 'User-Agent: PHP-Proxy-Test'
    ],
]);

$response = @file_get_contents($url, false, $context);

if ($response === false) {
    echo 'Ошибка при получении содержимого.';
} else {
    echo $response;
}
?>

Прокси с аутентификацией

Аутентификация для file_get_contents также указывается в строке прокси.

<?php
$proxy = 'tcp://username:password@your_proxy_ip:port';
$url = 'http://whatismyip.com';

$context = stream_context_create([
    'http' => [
        'proxy' => $proxy,
        'request_fulluri' => true,
        'method' => 'GET',
        'header' => 'User-Agent: PHP-Proxy-Auth-Test'
    ],
]);

$response = @file_get_contents($url, false, $context);

if ($response === false) {
    echo 'Ошибка при получении содержимого.';
} else {
    echo $response;
}
?>

file_get_contents не поддерживает SOCKS прокси напрямую через контекстные опции http.

Сравнение методов настройки прокси

Характеристика cURL Guzzle HTTP Client file_get_contents
Простота использования Средняя (много опций) Высокая (абстракция cURL) Высокая (для простых случаев)
Поддержка HTTP/HTTPS Полная Полная Ограниченная (только HTTP/HTTPS)
Поддержка SOCKS Полная (SOCKS4/SOCKS5) Полная (через cURL) Отсутствует
Поддержка аутентификации Полная (Basic, Digest, NTLM и др.) Полная (через URL или опции) Ограниченная (Basic через URL)
Гибкость/Контроль Высокая (детальный контроль над запросом) Высокая (удобный API, промежуточное ПО) Низкая (минимум настроек)
Обработка ошибок Детальная (curl_errno, curl_error) Детальная (исключения, PSR-7) Примитивная (возвращает false, предупреждения)
Производительность Высокая (нативная библиотека) Высокая (на основе cURL) Средняя (для простых запросов)
Рекомендуемое применение Низкоуровневые задачи, максимальный контроль, специфические протоколы Большинство современных PHP-приложений, REST API, скрапинг Простые GET-запросы без сложных требований к прокси

Ошибки и отладка

При работе с прокси могут возникать следующие проблемы:

  • Connection refused/timed out: Прокси-сервер недоступен, неверный IP/порт, или сетевые ограничения.
  • Proxy authentication required: Неверные учетные данные прокси.
  • Bad Gateway (502) / Proxy Error: Прокси-сервер не смог связаться с целевым сервером или возникла внутренняя ошибка прокси.
  • SSL Handshake Failed: Проблемы с SSL-сертификатами прокси или целевого сервера.

Для отладки:

  • cURL: Используйте curl_setopt($ch, CURLOPT_VERBOSE, true); для получения подробного вывода о процессе запроса, включая взаимодействие с прокси. Также curl_errno() и curl_error() предоставляют информацию об ошибках.
  • Guzzle: Включите опцию debug в конфигурации запроса или клиента: ['debug' => true]. Это выведет подробную информацию о запросе и ответе на stderr.
  • file_get_contents: Проверяйте возвращаемое значение на false и используйте error_get_last() для получения информации о последней ошибке PHP.
  • Проверка прокси: Убедитесь, что прокси-сервер активен и доступен из среды выполнения PHP, например, с помощью утилиты curl из командной строки.
Обновлено: 03.03.2026
Назад к категории

Попробуйте наши прокси

20,000+ прокси в 100+ странах мира