Налаштування PHP проксі для cURL, Guzzle та file_get_contents передбачає конфігурацію опцій HTTP-клієнта або контекстів потоку для маршрутизації вихідних запитів через вказаний проксі-сервер, зазвичай шляхом визначення хоста, порту та облікових даних для автентифікації проксі.
Використання проксі-сервера з PHP дозволяє додаткам маскувати свою вихідну IP-адресу, обходити геообмеження, отримувати доступ до ресурсів з внутрішніх мереж або керувати швидкістю запитів для веб-скрейпінгу та взаємодії з API. Вибір методу залежить від необхідного контролю, складності запитів та потреб обробки помилок.
Використання cURL
cURL — це надійна бібліотека для виконання HTTP-запитів, що пропонує широкий контроль над параметрами з'єднання, включаючи налаштування проксі. Це поширений вибір для складних веб-взаємодій, і вона зазвичай доступна як PHP-розширення (php-curl).
Базове налаштування проксі
Щоб маршрутизувати запит через HTTP або HTTPS проксі, використовуйте CURLOPT_PROXY та CURLOPT_PROXYPORT.
<?php
$ch = curl_init();
// Цільова URL
curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/data');
// Налаштування проксі
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
// Повернути передачу як рядок замість прямого виведення
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
SOCKS Проксі
cURL підтримує SOCKS проксі (SOCKS4, SOCKS4a, SOCKS5, SOCKS5h). Вкажіть тип проксі за допомогою CURLOPT_PROXYTYPE.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Налаштування SOCKS5 проксі
curl_setopt($ch, CURLOPT_PROXY, 'socks5.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 1080);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // Або CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A, CURLPROXY_SOCKS5_HOSTNAME
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
Проксі з автентифікацією
Для проксі, що вимагають автентифікації, використовуйте CURLOPT_PROXYUSERPWD з рядком username:password.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Налаштування проксі з автентифікацією
curl_setopt($ch, CURLOPT_PROXY, 'authproxy.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'proxyuser:proxypassword');
// Опціонально: Вказати метод автентифікації проксі (наприклад, CURLAUTH_BASIC, CURLAUTH_DIGEST)
// curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
HTTPS Проксі (CONNECT Тунелювання)
При підключенні до HTTPS-цілі через HTTP-проксі, cURL використовує метод HTTP CONNECT для встановлення тунелю. CURLOPT_HTTPPROXYTUNNEL може явно увімкнути це, хоча часто це обробляється автоматично.
<?php
$ch = curl_init();
// Цільова HTTPS URL
curl_setopt($ch, CURLOPT_URL, 'https://secure.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Налаштування проксі
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
// Увімкнути тунелювання для HTTPS через HTTP проксі (часто мається на увазі)
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
// Обробка перевірки SSL-сертифіката (вимкнути для тестування, увімкнути для продакшну)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
Загальні опції cURL для проксі
CURLOPT_TIMEOUT: Максимальний час у секундах для операції cURL.CURLOPT_CONNECTTIMEOUT: Максимальний час у секундах для встановлення з'єднання.CURLOPT_FOLLOWLOCATION: Слідувати будь-яким HTTP-заголовкамLocation:.CURLOPT_MAXREDIRS: Максимальна кількість перенаправлень, за якими потрібно слідувати.CURLOPT_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYHOST: Контроль перевірки SSL-сертифіката. Встановитиtrueдля продакшну.CURLOPT_HEADER: Включити заголовок у вивід.
Використання Guzzle
Guzzle — це популярний PHP HTTP-клієнт, який надає вищий рівень абстракції над cURL, спрощуючи типові HTTP-завдання. Він вимагає встановлення через Composer.
Базове налаштування проксі
Клієнти та запити Guzzle приймають опцію proxy. Її можна визначити глобально для клієнта або для кожного запиту.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
// Базовий URI для всіх запитів, зроблених цим клієнтом
'base_uri' => 'http://example.com/',
// Глобальне налаштування проксі для клієнта
'proxy' => 'http://proxy.example.com:8080',
]);
try {
$response = $client->request('GET', 'api/data');
echo $response->getBody();
} catch (GuzzleHttp\Exception\RequestException $e) {
echo 'Guzzle error: ' . $e->getMessage();
}
?>
Проксі з автентифікацією
Включіть облікові дані для автентифікації безпосередньо в URI проксі для HTTP/HTTPS проксі.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'http://example.com/',
// Проксі з автентифікацією
'proxy' => 'http://proxyuser:proxypassword@authproxy.example.com:8080',
]);
try {
$response = $client->request('GET', 'api/data');
echo $response->getBody();
} catch (GuzzleHttp\Exception\RequestException $e) {
echo 'Guzzle error: ' . $e->getMessage();
}
?>
SOCKS Проксі
Вкажіть SOCKS проксі, використовуючи схему socks в URI проксі.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'http://example.com/',
// SOCKS5 проксі
'proxy' => 'socks5://socks5.example.com:1080',
]);
try {
$response = $client->request('GET', 'api/data');
echo $response->getBody();
} catch (GuzzleHttp\Exception\RequestException $e) {
echo 'Guzzle error: ' . $e->getMessage();
}
?>
Проксі для кожного запиту
Опція proxy може бути перевизначена або вказана для окремих запитів.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(); // Без глобального проксі
try {
$response = $client->request('GET', 'http://example.com/api/data', [
'proxy' => 'http://perrequestproxy.example.com:8080', // Проксі для цього конкретного запиту
]);
echo $response->getBody();
} catch (GuzzleHttp\Exception\RequestException $e) {
echo 'Guzzle error: ' . $e->getMessage();
}
?>
Загальні опції Guzzle для проксі
proxy: Рядок URI проксі (http://,https://,socks4://,socks5://).verify: Контролює перевірку SSL-сертифіката (true,falseабо шлях до CA-пакету).timeout: Загальний час очікування для запиту в секундах.connect_timeout: Час очікування для підключення до сервера в секундах.allow_redirects: Контролює обробку перенаправлень (true,falseабо масив опцій).
Використання file_get_contents
file_get_contents — це проста функція для читання вмісту файлів, включаючи URL-адреси. Вона може використовувати контексти потоку для налаштування проксі, але пропонує менше контролю та обробки помилок порівняно з cURL або Guzzle. Вона підходить для базових HTTP/HTTPS запитів з простими вимогами до проксі.
Базове налаштування проксі
Використовуйте stream_context_create для визначення налаштувань проксі в опціях http.
<?php
$proxy = 'tcp://proxy.example.com:8080';
$url = 'http://example.com/api/data';
$context = stream_context_create([
'http' => [
'proxy' => $proxy,
'request_fulluri' => true, // Важливо для HTTP проксі
],
]);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
echo 'Failed to retrieve content via proxy.';
} else {
echo $response;
}
?>
request_fulluri має бути встановлено в true при використанні HTTP-проксі, оскільки це вказує клієнту надсилати повний URI в рядку запиту (наприклад, GET http://example.com/path HTTP/1.0).
HTTPS Проксі
Для HTTPS-цілей обгортка потоку https обробляє налаштування проксі аналогічно http.
<?php
$proxy = 'tcp://proxy.example.com:8080';
$url = 'https://secure.example.com/data';
$context = stream_context_create([
'http' => [ // Примітка: Конфігурація проксі все ще знаходиться в 'http' для CONNECT тунелювання
'proxy' => $proxy,
'request_fulluri' => true,
],
'ssl' => [ // Опції перевірки SSL/TLS
'verify_peer' => false, // Вимкнути для тестування, увімкнути для продакшну
'verify_peer_name' => false,
],
]);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
echo 'Failed to retrieve content via proxy.';
} else {
echo $response;
}
?>
Проксі з автентифікацією
Автентифікація проксі для file_get_contents зазвичай обробляється шляхом ручного встановлення заголовка Proxy-Authorization в опціях контексту http.
<?php
$proxy = 'tcp://proxy.example.com:8080';
$url = 'http://example.com/api/data';
$proxyUser = 'proxyuser';
$proxyPass = 'proxypassword';
// Base64 кодування username:password для базової автентифікації
$authHeader = 'Proxy-Authorization: Basic ' . base64_encode("$proxyUser:$proxyPass");
$context = stream_context_create([
'http' => [
'proxy' => $proxy,
'request_fulluri' => true,
'header' => $authHeader,
],
]);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
echo 'Failed to retrieve content via proxy.';
} else {
echo $response;
}
?>
Обмеження file_get_contents з проксі
- Відсутність підтримки SOCKS проксі: Обгортки потоку PHP не підтримують SOCKS проксі нативно.
- Обмежена обробка помилок: Інформація про помилки мінімальна, покладаючись на попередження або повернення
false. - Менший контроль: Детальний контроль над заголовками запитів, таймаутами та обробкою перенаправлень менш гнучкий.
- Продуктивність: Може бути менш продуктивним для одночасних або численних запитів порівняно з cURL.
Порівняння методів PHP проксі
| Функція | cURL (через php-curl) |
Guzzle (через Composer) | file_get_contents (через контексти потоку) |
|---|---|---|---|
| Простота використання | Помірна (пряме встановлення опцій) | Висока (об'єктно-орієнтований, плавний інтерфейс) | Висока (простий виклик функції, налаштування контексту) |
| Типи проксі | HTTP, HTTPS (CONNECT), SOCKS4/4a/5/5h | HTTP, HTTPS (CONNECT), SOCKS4/5 | HTTP, HTTPS (CONNECT) |
| Автентифікація | CURLOPT_PROXYUSERPWD |
Вбудований URI (user:pass@host) |
Ручний заголовок Proxy-Authorization |
| Обробка помилок | Детальна (curl_errno, curl_error) |
Надійна (винятки, відповіді PSR-7) | Базова (повернення false, попередження) |
| Рівень контролю | Високий (детальний контроль над усіма опціями cURL) | Високий (обгортає cURL, пропонує високорівневі опції) | Низький (обмежений опціями контексту потоку) |
| SSL-перевірка | CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST |
Опція verify |
Опції контексту ssl (verify_peer, verify_peer_name) |
| Обробка перенаправлень | CURLOPT_FOLLOWLOCATION, CURLOPT_MAXREDIRS |
Опція allow_redirects |
Обмежена (автоматична для HTTP, менш конфігурована) |
| Залежності | Розширення PHP cURL | Розширення PHP cURL, Composer, пакет Guzzle | Відсутні (вбудована функція PHP) |
| Найкращий варіант використання | Складна, високопродуктивна, низькорівнева інтеграція | Сучасні додатки, REST API, надійна обробка помилок | Прості, швидкі скрипти для базових GET-запитів |