使用 PHP cURL 连接代理 IP
在 PHP cURL 句柄上设置 HTTP 或 SOCKS 代理,将网站 URL 单独保留,并区分传输错误和 HTTP 响应。
在 curl_init() 中保留网站地址,将中间代理设置在这个句柄上。PHP 需要自己的 cURL 扩展;终端里的 curl 可执行文件能工作,并不能证明扩展可用。
<?php
$ch = curl_init('https://example.com/');
curl_setopt_array($ch, [
CURLOPT_PROXY => 'http://203.0.113.10:8080',
CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
CURLOPT_NOPROXY => '',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 15,
]);
$body = curl_exec($ch);
if ($body === false) {
throw new RuntimeException(curl_error($ch), curl_errno($ch));
}
echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL;
echo $body;将文档示例 IP 和端口替换为你的 HTTP 代理,或 HTTP 代理列表中的条目。CURLOPT_NOPROXY 为本次测试清除绕过规则;CURLOPT_RETURNTRANSFER 返回响应体,而不是直接发送到浏览器。连接时限约束建立连接的过程,总超时则限制整个 cURL 操作。
对于 SOCKS5 端点,在 curl_exec() 之前替换 HTTP 代理选项:
curl_setopt($ch, CURLOPT_PROXY, '203.0.113.10:1080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);CURLPROXY_SOCKS5_HOSTNAME 将目标 DNS 交给 SOCKS 服务器处理。请使用明确标示的协议,单凭端口 1080 无法识别协议。两种代理选择都不需要关闭网站证书验证。
严格检查 $body === false。空响应体也可能表示传输成功,而隧道可能在网站作出任何响应之前就已失败。反过来,非空响应体也可能伴随 403、404 或 429。将 CURLINFO_RESPONSE_CODE 与 cURL 的错误结果结合起来看,判断完成的请求是否满足你的任务。