首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP cURL 支持 SOCKS5 代理的配置與測試代碼

     編輯:PHP 綜合知識

核心配置

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_HTTP0默認 HTTP/HTTPS 代理
CURLPROXY_SOCKS44SOCKS4
CURLPROXY_SOCKS55SOCKS5(不解析域名,本地解析)
CURLPROXY_SOCKS4A6SOCKS4a(遠程解析域名)
CURLPROXY_SOCKS5_HOSTNAME7SOCKS5(遠程解析域名,推薦)

推薦使用 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";
}

進階應用場景

  • 爬蟲 IP 輪換: 維護 SOCKS5 代理池,請求前隨機選取,失敗自動切換。
  • 多賬號隔離: 每個賬號綁定固定代理,Session 存儲代理標識。
  • 突破地域限制: 選擇目標國家出口 IP 的 SOCKS5 代理。
  • 內網穿透: 通過 SSH 隧道 ssh -D 1080 user@server 建立本地 SOCKS5,cURL 訪問內網資源。

注意事項

  • PHP 需編譯 --with-curl 且 cURL 庫版本 ≥ 7.18.1 支持 SOCKS5_HOSTNAME。
  • SOCKS5 不支持 HTTP 標頭轉發(如 X-Forwarded-For),目標服務器見到的是代理出口 IP。
  • UDP 支持需 cURL 7.21.7+ 且 CURLOPT_PROXYTYPE 配合 CURLOPT_UDP(罕用)。
  • Windows 環境下 php_curl.dll 依賴 libssh2.dll、libssl.dll、libcrypto.dll、zlib1.dll 等,確保在 PATH 中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved