cURL 原生支持 SOCKS4/4a/5 代理,僅需設置三個選項即可。
<?php
$ch = curl_init();
// 目標 URL(被代理訪問的地址)
curl_setopt($ch, CURLOPT_URL, 'https://httpbin.org/ip');
// 【關鍵】設置代理類型為 SOCKS5
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
// 【關鍵】代理服務器地址:端口
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:1080'); // 例:本地 Shadowsocks/V2Ray 默認端口
// 【可選】代理認證(用戶名:密碼)
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'username:password');
// 常規設置
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回字符串而非直接輸出
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 超時秒數
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 連接超時
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟隨重定向
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 測試環境跳過 SSL 驗證
$response = curl_exec($ch);
if ($response === false) {
echo "cURL 錯誤: " . curl_error($ch);
} else {
echo "響應: $response";
// 應返回代理出口 IP,驗證代理生效
}
curl_close($ch);
| 常量 | 值 | 說明 |
|---|---|---|
| CURLPROXY_HTTP | 0 | 默認 HTTP/HTTPS 代理 |
| CURLPROXY_SOCKS4 | 4 | SOCKS4 |
| CURLPROXY_SOCKS5 | 5 | SOCKS5(不解析域名,本地解析) |
| CURLPROXY_SOCKS4A | 6 | SOCKS4a(遠程解析域名) |
| CURLPROXY_SOCKS5_HOSTNAME | 7 | SOCKS5(遠程解析域名,推薦) |
推薦使用 CURLPROXY_SOCKS5_HOSTNAME,由代理服務器端進行 DNS 解析,防止本地 DNS 洩漏或解析不一致。
<?php
function testSocks5Proxy(string $proxy, string $targetUrl = 'https://httpbin.org/ip', ?string $auth = null): array {
$ch = curl_init($targetUrl);
curl_setopt_array($ch, [
CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5_HOSTNAME,
CURLOPT_PROXY => $proxy,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
]);
if ($auth) {
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $auth);
}
$start = microtime(true);
$response = curl_exec($ch);
$duration = round((microtime(true) - $start) * 1000, 2);
$info = curl_getinfo($ch);
$error = curl_error($ch);
curl_close($ch);
return [
'success' => $response !== false && $info['http_code'] === 200,
'http_code' => $info['http_code'],
'duration_ms' => $duration,
'response' => $response,
'error' => $error,
'proxy' => $proxy,
];
}
// 批量測試代理池
$proxies = [
'127.0.0.1:1080',
'192.168.1.100:1080:user:pass', // 格式 ip:port:user:pass
];
foreach ($proxies as $p) {
$parts = explode(':', $p);
$proxyAddr = $parts[0] . ':' . $parts[1];
$auth = count($parts) === 4 ? $parts[2] . ':' . $parts[3] : null;
$result = testSocks5Proxy($proxyAddr, 'https://api.ipify.org?format=json', $auth);
echo $result['success'] ? "✅ {$proxyAddr} 可用 ({$result['duration_ms']}ms) IP: {$result['response']}\n"
: "❌ {$proxyAddr} 失敗: {$result['error']}\n";
}
ssh -D 1080 user@server 建立本地 SOCKS5,cURL 訪問內網資源。--with-curl 且 cURL 庫版本 ≥ 7.18.1 支持 SOCKS5_HOSTNAME。X-Forwarded-For),目標服務器見到的是代理出口 IP。CURLOPT_PROXYTYPE 配合 CURLOPT_UDP(罕用)。php_curl.dll 依賴 libssh2.dll、libssl.dll、libcrypto.dll、zlib1.dll 等,確保在 PATH 中。