编程 PHP 使用代理 IP 通过 cURL 请求数据

2024-11-19 02:52:08 +0800 CST views 826

以下是一个使用 cURL 进行 HTTP 请求的 PHP 函数示例,支持独享 IP 模式和隧道代理。

/**
 * 使用 cURL 发起 HTTP 请求并支持独享 IP 代理
 *
 * @param string $url 请求的 URL
 * @param array $data 发送的 POST 数据 (可选)
 * @param array $headers HTTP 头信息 (可选)
 * @param int $second 请求超时时间 (秒)
 * @return string|false 请求的响应结果,失败返回 false
 */
function getdata($url, $data = [], $headers = [], $second = 60) {
    $ch = curl_init();

    // 设置请求超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, $second);

    // 设置请求的 URL
    curl_setopt($ch, CURLOPT_URL, $url);

    // 添加默认的 'Expect: ' 头,防止 100-continue 的问题
    $headers = array_merge(['Expect: '], $headers);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    // SSL 相关配置
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    // 使用 HTTP 1.0 协议
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

    // 仅解析 IPv4 地址
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

    // 允许重定向
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    // 返回请求结果而非直接输出
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // 使用独享 IP 模式或隧道代理(可选)
    curl_setopt($ch, CURLOPT_PROXY, 'http://wy11:1121@101.89.161.13:20182');

    // 如果需要,可以设置为 SOCKS5 或 HTTP 代理
    // curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
    // curl_setopt($ch, CURLOPT_PROXY, 'socks5://user:pass@host:port');

    // 设置 POST 数据(如果有)
    if ($data) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    // 执行请求并获取结果
    $result = curl_exec($ch);
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    // 判断请求是否成功
    if ($responseCode == 200) {
        curl_close($ch);
        return $result;
    } else {
        $error = curl_errno($ch);
        curl_close($ch);
        return false; // 返回 false 以表示请求失败
    }
}

代码说明

  • curl_setopt:用于设置 cURL 请求的各项参数。
  • CURLOPT_PROXY:指定代理服务器地址(在此示例中为独享 IP 模式)。
  • CURLOPT_PROXYTYPE:指定代理类型(如 CURLPROXY_SOCKS5)。
  • CURLOPT_TIMEOUT:设置请求的超时时间。
  • CURLOPT_RETURNTRANSFER:设为 true 时,cURL 将返回请求的响应而不是直接输出。

使用示例

$url = "https://example.com/api";
$response = getdata($url, ['param' => 'value']);
if ($response) {
    echo "请求成功: " . $response;
} else {
    echo "请求失败";
}

此函数可以根据实际需求进行修改和扩展,如添加更多的错误处理、日志记录或调试信息。

复制全文 生成海报 编程 网络请求 PHP开发

推荐文章

jQuery `$.extend()` 用法总结
2024-11-19 02:12:45 +0800 CST
Go 单元测试
2024-11-18 19:21:56 +0800 CST
维护网站维护费一年多少钱?
2024-11-19 08:05:52 +0800 CST
使用 Go Embed
2024-11-19 02:54:20 +0800 CST
npm速度过慢的解决办法
2024-11-19 10:10:39 +0800 CST
前端项目中图片的使用规范
2024-11-19 09:30:04 +0800 CST
跟着 IP 地址,我能找到你家不?
2024-11-18 12:12:54 +0800 CST
windon安装beego框架记录
2024-11-19 09:55:33 +0800 CST
HTML + CSS 实现微信钱包界面
2024-11-18 14:59:25 +0800 CST
Golang在整洁架构中优雅使用事务
2024-11-18 19:26:04 +0800 CST
LLM驱动的强大网络爬虫工具
2024-11-19 07:37:07 +0800 CST
php strpos查找字符串性能对比
2024-11-19 08:15:16 +0800 CST
Vue3中如何扩展VNode?
2024-11-17 19:33:18 +0800 CST
Vue中的表单处理有哪几种方式?
2024-11-18 01:32:42 +0800 CST
Golang 中你应该知道的 noCopy 策略
2024-11-19 05:40:53 +0800 CST
10个几乎无人使用的罕见HTML标签
2024-11-18 21:44:46 +0800 CST
JavaScript 的模板字符串
2024-11-18 22:44:09 +0800 CST
Vue中的异步更新是如何实现的?
2024-11-18 19:24:29 +0800 CST
前端如何一次性渲染十万条数据?
2024-11-19 05:08:27 +0800 CST
JavaScript 实现访问本地文件夹
2024-11-18 23:12:47 +0800 CST
Golang中国地址生成扩展包
2024-11-19 06:01:16 +0800 CST
程序员茄子在线接单