cURL, Guzzle ve file_get_contents için PHP proxy kurulumu, giden istekleri belirtilen bir proxy sunucusu üzerinden yönlendirmek amacıyla HTTP istemci seçeneklerini veya stream context'lerini yapılandırmak anlamına gelir; bunun için genellikle proxy'nin host adresi, portu ve kimlik doğrulama bilgileri tanımlanır.
PHP ile proxy sunucusu kullanmak, uygulamanın kaynak IP adresini gizlemesini, coğrafi kısıtlamaları aşmasını, iç ağlardaki kaynaklara erişmesini veya web scraping ve API entegrasyonlarında istek hızını yönetmesini sağlar. Yöntem seçimi; ihtiyaç duyulan kontrol düzeyine, isteklerin karmaşıklığına ve hata yönetimi gereksinimlerine bağlıdır.
cURL kullanımı
cURL, HTTP istekleri yapmak için güçlü bir kütüphanedir ve proxy ayarları dahil olmak üzere bağlantı parametreleri üzerinde geniş kontrol sunar. Karmaşık web etkileşimleri için yaygın bir tercihtir ve genellikle bir PHP eklentisi (php-curl) olarak bulunur.
Temel proxy kurulumu
Bir isteği HTTP veya HTTPS proxy üzerinden yönlendirmek için CURLOPT_PROXY ve CURLOPT_PROXYPORT seçeneklerini kullanın.
<?php
$ch = curl_init();
// Hedef URL
curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/data');
// Proxy ayarları
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
// Aktarımı doğrudan yazdırmak yerine string olarak döndür
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 proxy
cURL, SOCKS proxy'leri (SOCKS4, SOCKS4a, SOCKS5, SOCKS5h) destekler. Proxy türünü CURLOPT_PROXYTYPE ile belirtin.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// SOCKS5 proxy ayarları
curl_setopt($ch, CURLOPT_PROXY, 'socks5.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 1080);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // Veya 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);
?>
Kimlik doğrulamalı proxy
Kimlik doğrulama gerektiren proxy'ler için CURLOPT_PROXYUSERPWD seçeneğini username:password biçiminde bir string ile kullanın.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Kimlik doğrulamalı proxy ayarları
curl_setopt($ch, CURLOPT_PROXY, 'authproxy.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'proxyuser:proxypassword');
// İsteğe bağlı: proxy kimlik doğrulama yöntemini belirtin (ör. 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 proxy (CONNECT tünelleme)
Bir HTTP proxy üzerinden HTTPS hedefine bağlanırken cURL, tünel açmak için HTTP CONNECT yöntemini kullanır. CURLOPT_HTTPPROXYTUNNEL bunu açıkça etkinleştirebilir, ancak çoğu zaman otomatik olarak yönetilir.
<?php
$ch = curl_init();
// Hedef HTTPS URL
curl_setopt($ch, CURLOPT_URL, 'https://secure.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Proxy ayarları
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com');
curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
// HTTP proxy üzerinden HTTPS için tünellemeyi etkinleştir (çoğunlukla örtük)
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
// SSL sertifika doğrulaması (test için kapatın, üretimde açın)
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);
?>
Proxy'ler için yaygın cURL seçenekleri
CURLOPT_TIMEOUT: cURL işlemi için saniye cinsinden maksimum süre.CURLOPT_CONNECTTIMEOUT: bağlantı kurmak için saniye cinsinden maksimum süre.CURLOPT_FOLLOWLOCATION:Location:HTTP başlıklarını takip eder.CURLOPT_MAXREDIRS: takip edilecek maksimum yönlendirme sayısı.CURLOPT_SSL_VERIFYPEER,CURLOPT_SSL_VERIFYHOST: SSL sertifika doğrulamasını denetler. Üretimdetrueyapın.CURLOPT_HEADER: başlığı çıktıya dahil eder.
Guzzle kullanımı
Guzzle, cURL üzerinde daha üst seviye bir soyutlama sunan ve yaygın HTTP işlerini basitleştiren popüler bir PHP HTTP istemcisidir. Composer ile kurulması gerekir.
Temel proxy kurulumu
Guzzle istemcileri ve istekleri proxy seçeneğini kabul eder. Bu seçenek istemci için global olarak ya da istek bazında tanımlanabilir.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
// Bu istemciyle yapılan tüm istekler için temel URI
'base_uri' => 'http://example.com/',
// İstemci için global proxy ayarı
'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();
}
?>
Kimlik doğrulamalı proxy
HTTP/HTTPS proxy'ler için kimlik bilgilerini doğrudan proxy URI'sine ekleyin.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'http://example.com/',
// Kimlik doğrulamalı proxy
'proxy' => 'http://proxyuser:[email protected]:8080',
]);
try {
$response = $client->request('GET', 'api/data');
echo $response->getBody();
} catch (GuzzleHttp\Exception\RequestException $e) {
echo 'Guzzle error: ' . $e->getMessage();
}
?>
SOCKS proxy
SOCKS proxy'leri proxy URI'sinde socks şemasıyla belirtin.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'http://example.com/',
// SOCKS5 proxy
'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();
}
?>
İstek bazında proxy
proxy seçeneği tek tek istekler için geçersiz kılınabilir veya ayrıca belirtilebilir.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(); // Global proxy yok
try {
$response = $client->request('GET', 'http://example.com/api/data', [
'proxy' => 'http://perrequestproxy.example.com:8080', // Yalnızca bu istek için proxy
]);
echo $response->getBody();
} catch (GuzzleHttp\Exception\RequestException $e) {
echo 'Guzzle error: ' . $e->getMessage();
}
?>
Proxy'ler için yaygın Guzzle seçenekleri
proxy: proxy URI string'i (http://,https://,socks4://,socks5://).verify: SSL sertifika doğrulamasını denetler (true,falseveya CA paketinin yolu).timeout: isteğin saniye cinsinden toplam zaman aşımı.connect_timeout: sunucuya bağlanmak için saniye cinsinden zaman aşımı.allow_redirects: yönlendirme yönetimini denetler (true,falseveya seçenek dizisi).
file_get_contents kullanımı
file_get_contents, URL'ler dahil dosya içeriğini okumak için kullanılan basit bir fonksiyondur. Proxy ayarlarını yapılandırmak için stream context kullanabilir, ancak cURL veya Guzzle'a kıyasla daha az kontrol ve hata yönetimi sunar. Basit proxy gereksinimleri olan temel HTTP/HTTPS istekleri için uygundur.
Temel proxy kurulumu
Proxy ayarlarını http seçenekleri içinde tanımlamak için stream_context_create kullanın.
<?php
$proxy = 'tcp://proxy.example.com:8080';
$url = 'http://example.com/api/data';
$context = stream_context_create([
'http' => [
'proxy' => $proxy,
'request_fulluri' => true, // HTTP proxy'ler için şart
],
]);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
echo 'Failed to retrieve content via proxy.';
} else {
echo $response;
}
?>
HTTP proxy kullanırken request_fulluri mutlaka true olmalıdır; bu, istemciye istek satırında tam URI'yi göndermesini söyler (ör. GET http://example.com/path HTTP/1.0).
HTTPS proxy
HTTPS hedefleri için https stream wrapper'ı proxy kurulumunu http ile benzer şekilde ele alır.
<?php
$proxy = 'tcp://proxy.example.com:8080';
$url = 'https://secure.example.com/data';
$context = stream_context_create([
'http' => [ // Not: CONNECT tünelleme için proxy yapılandırması yine 'http' altındadır
'proxy' => $proxy,
'request_fulluri' => true,
],
'ssl' => [ // SSL/TLS doğrulama seçenekleri
'verify_peer' => false, // Test için kapatın, üretimde açın
'verify_peer_name' => false,
],
]);
$response = @file_get_contents($url, false, $context);
if ($response === false) {
echo 'Failed to retrieve content via proxy.';
} else {
echo $response;
}
?>
Kimlik doğrulamalı proxy
file_get_contents için proxy kimlik doğrulaması genellikle http context seçenekleri içinde Proxy-Authorization başlığının elle ayarlanmasıyla yapılır.
<?php
$proxy = 'tcp://proxy.example.com:8080';
$url = 'http://example.com/api/data';
$proxyUser = 'proxyuser';
$proxyPass = 'proxypassword';
// Basic kimlik doğrulama için username:password değerini Base64 ile kodla
$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;
}
?>
Proxy'lerle file_get_contents sınırlamaları
- SOCKS proxy desteği yok: PHP'nin stream wrapper'ları SOCKS proxy'leri yerel olarak desteklemez.
- Sınırlı hata yönetimi: hata bilgisi asgari düzeydedir; uyarılara veya
falsedönüş değerine dayanır. - Daha az kontrol: istek başlıkları, zaman aşımları ve yönlendirme yönetimi üzerinde ayrıntılı kontrol daha esnek değildir.
- Performans: eşzamanlı veya çok sayıda istekte cURL'e kıyasla daha düşük performanslı olabilir.
PHP proxy yöntemlerinin karşılaştırması
| Özellik | cURL (php-curl ile) |
Guzzle (Composer ile) | file_get_contents (stream context ile) |
|---|---|---|---|
| Kullanım kolaylığı | Orta (doğrudan seçenek tanımlama) | Yüksek (nesne yönelimli, akıcı arayüz) | Yüksek (basit fonksiyon çağrısı, context kurulumu) |
| Proxy türleri | HTTP, HTTPS (CONNECT), SOCKS4/4a/5/5h | HTTP, HTTPS (CONNECT), SOCKS4/5 | HTTP, HTTPS (CONNECT) |
| Kimlik doğrulama | CURLOPT_PROXYUSERPWD |
URI içine gömülü (user:pass@host) |
Elle Proxy-Authorization başlığı |
| Hata yönetimi | Ayrıntılı (curl_errno, curl_error) |
Sağlam (exception'lar, PSR-7 yanıtları) | Temel (false dönüşü, uyarılar) |
| Kontrol düzeyi | Yüksek (tüm cURL seçenekleri üzerinde ayrıntılı kontrol) | Yüksek (cURL'ü sarar, üst seviye seçenekler sunar) | Düşük (stream context seçenekleriyle sınırlı) |
| SSL doğrulama | CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST |
verify seçeneği |
ssl context seçenekleri (verify_peer, verify_peer_name) |
| Yönlendirme yönetimi | CURLOPT_FOLLOWLOCATION, CURLOPT_MAXREDIRS |
allow_redirects seçeneği |
Sınırlı (HTTP için otomatik, az yapılandırılabilir) |
| Bağımlılıklar | PHP cURL eklentisi | PHP cURL eklentisi, Composer, Guzzle paketi | Yok (PHP'nin yerleşik fonksiyonu) |
| En uygun kullanım | Karmaşık, yüksek performanslı, düşük seviye entegrasyon | Modern uygulamalar, REST API'ler, sağlam hata yönetimi | Temel GET istekleri için basit, hızlı script'ler |
